Incrond运行但不执行命令CentOS 6.4

我已经复制这个问题在这里从StackOverflow …

我已经从EPEL仓库(0.5.9)安装incron(在你问之前;是的,我也尝试下载源代码并在本地编译(0.5.10);结果相同),并试图在我的CentOS 6.4上build立一个进程(最后)的虚拟盒子,我已经成功地在我的本地Ubuntu 12.04机器(包括incron在Ubuntu下工作的机器上)成功的原型:

有些信息在前面:

  • SELinux被设置为PERMISSIVE(我也试过了DISABLED,这似乎没有区别!)
  • 我已经使用visudo添加了我的脚本和被称为可执行文件的所有NOPASSWD来解决一些权限问题…
  • 我曾尝试应用incron的政策为这里desribed 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的克隆中(如我打算)但是我仍然得不到我的脚本输出,无论是它应该对input文件或它的任何日志做的工作…

  • 它的权限是正确的? (我只是在做根文件系统上的chmod -r 777时候再花一天的时间;))

  • 在Ubuntu 12.04下,执行sudo incrotab -e和input/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这一切都工作正常,但是当通过incrond调用incrond相同,甚至不能从它env > /dev/pts/0 。 (虽然我可以env > /tmp/envfile.txt

sudo service incrond statusvalidationincrond正在运行。 root和myusername被添加到/etc/incron.deny是空的。

下面是不推荐使用的,请参阅上面的重点,但阅读它的背景和扩展…

我为root的incrotab是:

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

/path/to/dropfolder/导致没有任何有用的事件发生。 日志在/ var / log / cron中生成,没有消息,文件夹中的文件不会发生任何操作。

所以我研究过:有人build议cron运行在一个最小的环境中,而且要执行复杂的命令/脚本,你可能必须执行你的.bashrc和/或在cron命令开始时导出你的PATH。

编辑:文档表明incron从系统表或root运行env从它的主机环境,因此只有incron由非root用户执行应该要求任何env或PATH小提琴

所以… 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 restartservice incrond restart ,和nope。

严重的措施: yum remove incronyum install incronchkconfig incrond on然后为了好测量一个sudo reboot

如何touch ./autorelabel和重新启动? 不!

没有。

我甚至没有从/tmp/ IN_ALL_EVENTS echo boo> > /home/myusername/boofile.txt得到任何东西/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确实试图做SOMETHING,但我没有输出任何地方…甚至一个echo > /dev/pts/0产生纳达结果。

如果我做根的incrontab /tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt /tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt /tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt像在一些线程中提示我发现处理cron环境问题我得到Aug 15 12:30:25 hostname incrond[1726]: cannot exec process: Permission denied这里的pid是不同的声称它发布的命令,所以显然有一些subprocess产卵在这里发生……这是在上面的SELinux策略链接中提到的,我觉得它们是相关的,但不应该PREMISSIVE和DISABLED SELinux设置不关心关于那个??

之前,我试图设置SELinux DISABLED我得到/var/log/audit/audit.log中的条目,表明incron试图做的事情,他们在最后的res=success …这似乎表明SELinux是让东西发生,但没有任何反应! 由于将SELinux设置为DISABLED,并返回到PERMISSIVE并重新启动(几次),我没有得到任何条目/var/log/audit/audit.log相关的incrond从service start等相关的东西。 WTH?


我已经尝试了上面描述的所有incron策略( sudo incrontab ),作为一个普通用户,虽然系统表(位于/etc/incron.d )具有相同的结果:p

我已经把厨房水槽扔到了这里(据我了解水槽的内容),我找不到解决办法…我错过了什么? 我希望有人能在短时间内让我觉得自己像个白痴!

好的,这是答案:

尽pipe我可以发现所有的文档都是相反的, incrond在CentOS 6.4下运行在一个稀疏的环境中,并且像cron一样运行。 在Ubuntu下,情况并非如此,incron从系统表和根表中inheritance它的环境,只有用户表运行在一个稀疏的环境中。 这当然意味着,如果你正在调用一个脚本(我),脚本需要build立它的环境,每一件事情都必须有一个完整的path。 一切 。 (好吧,除了内置的shell:p)

无数的Google和Bing以及堆栈溢出和服务器故障search都告诉我, cron是以这种方式运行的,但是他们似乎也都表明incron运行方式与Ubuntu下的文档中所述的一样。

底线,它现在的作品,耶!

  • 我想这只是表明:当有疑问时,定义环境,并使用完整的path…呃,实际上,只要做到这一点,节省自己的头痛。

(这并不能解决我对incron应用SELinux安全策略的问题,但是我稍后会在另一个post中担心)

我遇到过同样的问题。 经过大量的试验和错误,我发现我的原始线

 /path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand $@/$# 

不起作用,但下面的工作:

 /path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$# 

我猜incron不会用shebang(还?)来expression脚本,并且需要一个在命令中的解释器。

编辑:多一点testing后,我发现如果命令是(bash或shell)脚本,它将需要.sh扩展名,或者需要像/ bin / sh这样的解释器。 所以下面的例子都可以工作(至less在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 $@/$# 

由于名誉不足,我的贡献是作为一个单独的答案,而不是对user199085的评论。

是的,OP说的是centOS,但是对于Ubuntu的人来说,我还想在bin/sh之前粘贴sudo -u my_user_name my_user_name。 所以,这条线变成了

/path/to/watch IN_CLOSE_WRITE sudo -u my_user_name /bin/sh /usr/local/bin/mycommand $@/$#