CentOS 6.4下incrond正在运行但未执行命令

10

我已经从EPEL仓库安装了incron(如果您问的话;是的,我也尝试过下载源代码并在本地编译;结果相同),并试图在我的CentOS 6.4(最终版本)虚拟机上设置一个进程,该进程在我的本地Ubunto 12.04机器上已成功进行了原型设计:

首先提供一些信息:

  • SELinux设置为PERMISSIVE
  • 我已经通过visudo将我的脚本和可执行文件全部添加到NOPASSWD中,以解决某些权限问题...

如果我使用sudo /path/to/my/script.sh arguments从命令行调用我的脚本,它就像魅力一样工作。

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/文件夹中的事件不会产生任何作用,也不会生成日志、信息或对文件执行任何操作。

因此,我进行了研究:建议在最小环境下运行,并且要执行复杂的命令/脚本,您可能需要执行<.bashrc>和/或在cron命令开始时导出您的路径。

注意:我找不到支持incron也运行在最小环境中的文档,但是由于我的搜索结果与incron直接相关的任何有用结果都无法得到帮助,所以我想尝试一下!

编辑:文档表明从系统表或根目录运行的incron使用其主机环境的env,因此只有非root用户执行的incron需要任何类型的env或PATH调整

因此… incrontab for root:

/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 incronyum install incronchkconfig incrond on,最后再来一次sudo reboot

没有任何进展。

甚至/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)-是的,我确保我的脚本可执行…

因此,incron确实尝试做某些事情,但我在任何地方都没有输出…即使是简单的echo >/dev/pts/0也没有任何结果。

  • 感谢您修改我的格式错误

谢谢,我遇到了不同的问题,但是通过执行以下命令找到了解决方法:tail -f /var/log/cron | grep --line-buffered incron,我注意到每个命令都被执行了两次,但这是另一个问题.. :) - Niclas
1个回答

10

好的,这里是答案:

尽管我能找到的所有文档都声明相反,但在CentOS 6.4下,incrond在稀疏环境中运行并像cron一样。但在Ubuntu下情况并非如此,对于系统表和root表,incron继承其环境来自于root,仅用户表在稀疏环境中运行。当然,这意味着如果你正在调用脚本(我是这样做的),脚本需要构建它的环境,并且每个东西都必须有一个完整路径。EVERYTHING。(好吧,除了shell内置:p)

许多谷歌、必应、Stack Overflow和Server Fault的搜索都告诉我,cron是以这种方式运作的,但它们似乎也表明incron按照文档描述的方式运作,在Ubuntu下确实如此...

底线是,现在它可以工作了,耶!

  • 我想这只是表明:如果不确定,请定义环境并使用全路径... 嗯,实际上,始终这样做并节省头疼。

(这并没有解决我应用SELinux安全策略到incron的问题,但我会在另一篇文章中解决这个问题...)


感谢您分享这个。我遇到了同样的问题,当我明确声明所有路径时,它起作用了。谢谢您。 - chip
我在同一命令行中运行多个命令时遇到了大麻烦,所以最终我把所有内容放入Bash脚本中,并从incron中执行该脚本。 - TheStoryCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接