我从 StackOverflow 复制了这个问题...
我已经从 EPEL 存储库 (0.5.9) 安装了 incron(在您询问之前;是的,我也尝试下载源代码并在本地进行编译(0.5.10);结果相同)并试图在我的 CentOS 6.4(最终)虚拟盒上设置一个进程,我已经在本地 Ubuntu 12.04 机器上成功原型化了该进程(包括incron
在 Ubuntu 下完美运行的进程):
首先需要说明的是:
- SELinux 设置为 PERMISSIVE(我也尝试过 DISABLED,但似乎没有什么区别!)
- 我已将我的脚本和可执行文件添加到所有使用 NOPASSWD 的文件中,
visudo
以解决一些权限问题... 我尝试应用此处所述的 incron 策略http://blog.siphos.be/2013/05/a-selinux-policy-for-incron-finishing-up/但我不断
libsepol.policydb_read: policydb magic number 0x696c6f70 does not match expected magic number 0xf97cff8c or 0xf97cff8d semodule_package: Error while reading policy module from incron.te
当我尝试使用
semodule_package
我试图在脚本本身和预脚本中定义环境,
caller.sh
通过这样做,我能够env > /tmp/envfile.txt
表明脚本正在克隆中运行sudo env
(正如我预期的那样),但是我仍然没有从我的脚本中得到任何输出,无论是它应该在输入文件上执行的工作还是它的任何日志......这一定是权限问题吧?(我大约还需要一天时间才能
chmod -r 777
在根文件系统上完成这个任务 ;))在 Ubuntu 12.04 下,简单的执行
sudo incrotab -e
和输入操作/tmp/ IN_CREATE,IN_NO_LOOP env > /home/username/envfile.txt
表明 incron 已经在 root/sudo 环境中运行,正如 incron 文档建议的那样。这都是与 SELinux 相关的东西吗,或者 CentOS 中是否存在其他问题导致这变得如此困难?
如果我从命令行调用我的脚本,sudo /path/to/my/script.sh arguments
它就会像魔法一样运行。
或者就此而言,如果我调用caller.sh
它,一切都会正常,但是当被它caller.sh
调用时,甚至无法从它那里获得。(虽然我incrond
env > /dev/pts/0
能 env > /tmp/envfile.txt
sudo service incrond status
验证 incrond 是否正在运行。root 和 myusername 已添加到/etc/incron.allow
,/etc/incron.deny
为空。
以下内容已被弃用,请参阅上面的要点,但请阅读它以了解背景故事和扩展...
我的 root incrotab 是:
/path/to/dropfolder/ IN_CLOSE_WRITE sudo /path/to/my/script.sh $@/$#
事件导致/path/to/dropfolder/
没有发生任何有用的事情。日志在 /var/log/cron 中生成,没有消息,文件夹中的文件未发生任何操作。
因此我进行了研究:建议cron
在最小环境中运行,并且要执行复杂的命令/脚本,您可能必须.bashrc
在 cron 命令开始时执行和/或导出 PATH。
编辑:文档表明,incron
从系统表或 root 运行会从其主机环境中获取 env,因此只有incron
非 root 用户执行才需要任何类型的 env 或 PATH 调整
因此…root 的 incrontab:
/path/to/dropfolder IN_CLOSE_WRITE . /home/myusername/.bashrc; export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin; sudo /path/to/my/script.sh $@/$#"
没有骰子……尝试过&&
而不是;
=没有骰子。如果你能想到上述内容的变体,我可能已经尝试过了……
那么,让我们尝试一下吧restorecond -R /usr/sbin/incrond /etc/incron*
!嗯,那里也没有变化。 然后是service incrond stop
……不,不,不。service incrond start
service incrond restart
采取严厉措施:yum remove incron
和yum install incron
,chkconfig incrond on
然后采取妥善措施sudo reboot
!
那touch ./autorelabel
重启一下怎么样?不!
没有什么。
我甚至没有从中获得任何东西/tmp/ IN_ALL_EVENTS echo boo> > /home/myusername/boofile.txt
,因此我甚至无法env > envfile.txt
检查是否incron
在稀疏环境中运行......(参见上面的注释)
然而:service incrond status
收益incrond (pid xxxx) is running...
进一步检查/var/log/cron
得到的结果如下:Aug 14 15:05:30 hostname incrond[1584]: (root) CMD (sudo /path/to/DropFolder/script/subfolder/script-Beta-1.sh /home/username/DropFolder/testfile.file)
- 是的,我确定我的脚本是可执行的..
如果我将 root 的 incrontab 设置为包含,/tmp/ IN_ALL_EVENTS,IN_NO_LOOP env > /tmp/envfile.txt
则不会得到任何结果。tail/var/log/cron
包含:Aug 15 10:06:32 hostname incrond[1584]: (root) CMD (env > /tmp/envfile.txt)
但该文件不存在/tmp/
因此 incrond 确实试图做某事,但我没有在任何地方得到输出......甚至没有echo > /dev/pts/0
产生任何结果。
如果我按照在处理环境问题incrontab
/tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt
的多个线程中所建议的那样创建 root,我得到的是与声称它发出命令的那个不同,所以显然这里正在生成一些子进程……上面 SELinux 策略链接中提到过,我觉得它们是相关的,但 PREMISSIVE 和 DISABLED SELinux 设置不应该关心这个吗??cron
Aug 15 12:30:25 hostname incrond[1726]: cannot exec process: Permission denied
pid
在我尝试将 SELinux 设置为 DISABLED 之前,我收到的条目/var/log/audit/audit.log
表明 incron 正在尝试执行某些操作,并且它们res=success
在末尾被标记……这似乎表明 SELinux 正在让某些操作发生,但什么也没发生!自从将 SELinux 设置为 DISABLED 并重新设置为 PERMISSIVE 并重新启动(多次)后,除了与 etc 相关的内容外,我没有收到任何与/var/log/audit/audit.log
incrond 相关的条目service start
。WTH?
sudo incrontab
我以 root用户 ()、普通用户身份以及系统表 (位于)尝试了上述所有 incron 策略,/etc/incron.d
结果相同 :p
我已经用尽了一切办法(据我了解,水槽里的东西是这样的),但我找不到解决办法……我到底错过了什么?我希望有人能让我立刻觉得自己是个白痴!
答案1
我也遇到了同样的问题。经过多次尝试和错误,我发现我原来的
/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand $@/$#
不起作用,但下面的方法可以起作用:
/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
我猜测 incron 还不遵守带有 shebang 的脚本并且需要命令内的解释器。
编辑:经过进一步测试,我发现如果命令是(bash 或 shell)脚本,则需要 .sh 扩展名,或者需要在前面加上 /bin/sh 之类的解释器。因此,以下示例都可以正常工作(至少在 CentOS 6.4 下)
/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand.sh $@/$#
答案2
好的,答案如下:
尽管我能找到的所有文档都表明情况恰恰相反,但incrond
在 CentOS 6.4 下,它在稀疏环境中运行并表现为cron
。在 Ubuntu 下情况并非如此,在 Ubuntu 下,incron 从 root 继承了系统表和根表的环境,只有用户表在稀疏环境中运行。这当然意味着,如果您正在调用脚本(我正在调用),则脚本需要构建其环境,并且每个事物都必须具有完整路径。一切. (嗯,除了 shell 内置命令 :p)
无数次 Google 和 Bing 以及 Stack Overflow 和 Server Fault 搜索都告诉我它以cron
这种方式运行,但它们似乎也都表明它incron
按照文档中描述的方式运行,并且在 Ubuntu 下确实如此......
最重要的是,它现在可以起作用了,耶!
- 我想这只是表明:当有疑问时,定义环境并使用完整路径......呃,实际上,一直这样做就可以省去很多麻烦。
(这并不能解决我应用 SELinux 安全策略时遇到的问题incron
,但我稍后会在另一篇文章中解决这个问题……)
答案3
由于声誉不足,我的贡献是作为单独的答案而不是对用户 199085 的评论。
是的,原帖说的是 centOS,但对于 ubuntu 用户来说,我也必须坚持使用bitsudo -u my_user_name
之前的bin/sh
内容。因此,该行变为
/path/to/watch IN_CLOSE_WRITE sudo -u my_user_name /bin/sh /usr/local/bin/mycommand $@/$#
答案4
信息incrond: cannot exec process: Permission denied
尝试为x要执行的脚本添加权限(此权限可能已被、等“删除” ftp
)sftp
。
chmod +x /srv/datadisk01/your/incron_script.sh