incrond 在 CentOS 6.4 下运行但不执行命令

Posted

技术标签:

【中文标题】incrond 在 CentOS 6.4 下运行但不执行命令【英文标题】:incrond running but not executing command under CentOS 6.4 【发布时间】:2013-08-16 19:58:34 【问题描述】:

我已经从 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 为空。

我的根目录是:

/path/to/dropfolder/ IN_CLOSE_WRITE sudo /path/to/my/script.sh $@/$#

/path/to/dropfolder/ 中的事件不会导致任何事情发生。不会生成任何日志,没有消息,也不会对文件夹中的文件执行任何操作。

所以我进行了研究:建议 cron 在最小环境中运行,并且要执行复杂的命令/脚本,您可能必须执行 .bashrc 和/或在 cron 命令的开头导出 PATH .

注意:我找不到支持 incron 也在最小环境中运行的文档,但由于我的 google-fu(和 bing-fu!)未能产生任何有用的相关结果直接到incron我想好了,我会试试的!

编辑: 文档表明 incron 从系统表运行或 root 从其主机环境中获取 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) -是的,我确保我的脚本是可执行的..

所以 incrond 确实在尝试做某事,但我在任何地方都没有输出...即使是简单的 echo > /dev/pts/0 也会产生 nada 结果。

感谢您修复我的垃圾格式化作业

【问题讨论】:

谢谢,我有一个不同的问题,但我通过这样做找到了它:tail -f /var/log/cron | grep --line-buffered incron 并注意到每个命令执行两次,但这是另一个问题.. :) 【参考方案1】:

好的,答案如下:

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

大量的 Google 和 Bing、Stack Overflow 和 Server Fault 搜索都告诉我 cron 以这种方式运行,但它们似乎也都表明 incron 按照文档中的描述运行,它在 Ubuntu 下运行。 ..

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

我想这只是为了表明:当有疑问时定义环境并使用完整路径...呃,实际上,只要一直这样做,就不会让自己头疼。

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

【讨论】:

谢谢先生分享这个。有同样的问题,一旦我明确声明了所有路径,它就起作用了。 我在同一个命令行中运行多个命令时遇到了很大的麻烦,所以我最终将所有内容都放入了一个 bash 脚本,然后从 incron 中执行。

以上是关于incrond 在 CentOS 6.4 下运行但不执行命令的主要内容,如果未能解决你的问题,请参考以下文章

在 CentOS 6.4 上构建 gvim 7.4

如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin

如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin

如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin

如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin

apache_conf Codeigniter通过HHVM和FastCGI在Centos 6.4上运行