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 incron
和 yum install incron
,chkconfig 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 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