Incrond 正在运行但未执行命令 CentOS 6.4

Incrond 正在运行但未执行命令 CentOS 6.4

我从 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调用时,甚至无法从它那里获得。(虽然我incrondenv > /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 startservice incrond restart

采取严厉措施:yum remove incronyum install incronchkconfig 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 设置不应该关心这个吗??cronAug 15 12:30:25 hostname incrond[1726]: cannot exec process: Permission deniedpid

在我尝试将 SELinux 设置为 DISABLED 之前,我收到的条目/var/log/audit/audit.log表明 incron 正在尝试执行某些操作,并且它们res=success在末尾被标记……这似乎表明 SELinux 正在让某些操作发生,但什么也没发生!自从将 SELinux 设置为 DISABLED 并重新设置为 PERMISSIVE 并重新启动(多次)后,除了与 etc 相关的内容外,我没有收到任何与/var/log/audit/audit.logincrond 相关的条目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要执行的脚本添加权限(此权限可能已被、等“删除” ftpsftp

chmod +x /srv/datadisk01/your/incron_script.sh

相关内容