Incrond 运行但不执行命令 CentOS 6.4

Jaw*_*wzX 5 permissions selinux cron shell-scripting centos6

我已经从 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被调用时incrond,甚至不能env > /dev/pts/0从中调用。(虽然我CAN 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 $@/$#
Run Code Online (Sandbox Code Playgroud)

事件/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 $@/$#"
Run Code Online (Sandbox Code Playgroud)

没有骰子......尝试&&而不是;=没有骰子。如果你能想到上述的变化,我可能已经尝试过了……

那么,让我们尝试一些小动作restorecond -R /usr/sbin/incrond /etc/incron*吧!呵呵,那里也没有变化。 service incrond stop其次是service incrond start然后service incrond restart……不,不,不。

激烈的措施:yum remove incronyum install incronchkconfig incrond on然后是好的措施 a sudo reboot

ol'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我将一无所获。尾部/var/log/cron包含:Aug 15 10:06:32 hostname incrond[1584]: (root) CMD (env > /tmp/envfile.txt)但该文件不存在于/tmp/

所以incrond确实试图做一些事情,但我在任何地方都没有输出......甚至echo > /dev/pts/0产生nada结果。

如果我按照incrontab /tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt我发现处理cron环境问题的许多线程中的建议创建 root ,我得到Aug 15 12:30:25 hostname incrond[1726]: cannot exec process: Permission deniedpid这里与声称它发出命令的那个不同,所以显然这里发生了一些子进程产生......上面的 SELinux 政策链接,我觉得它们是相关的,但是 PREMISSIVE 和 DISABLED SELinux 设置不应该不关心吗??

在我尝试将 SELinux 设置为 DISABLED 之前,我收到/var/log/audit/audit.log了表明 incron 正在尝试做的事情的条目,并且它们res=success在最后被标记......这似乎表明 SELinux 正在让事情发生,但没有任何反应!自从将 SELinux 设置为 DISABLED 并返回到 PERMISSIVE 并重新启动(几次)后/var/log/audit/audit.log,除了与其他service start相关的事情之外,我没有得到任何与 incrond 相关的条目。什么?


我已经以 root ( sudo incrontab)、普通用户的身份尝试了上述所有 incron 策略,尽管系统表(位于/etc/incron.d)具有相同的结果:p

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

use*_*085 5

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

/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand $@/$#
Run Code Online (Sandbox Code Playgroud)

不起作用,但以下方法有效:

/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
Run Code Online (Sandbox Code Playgroud)

我猜 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 $@/$#
Run Code Online (Sandbox Code Playgroud)


Jaw*_*wzX 3

好的,答案如下:

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

大量的 Google、Bing、Stack Overflow 和服务器故障搜索都告诉我是cron这样操作的,但它们似乎也都表明incron按照文档中描述的方式操作,在 Ubuntu 下也是如此......

最重要的是,它现在可以工作了,耶!

  • 我想这只是表明:当有疑问时定义环境并使用完整路径......呃,实际上,只要一直这样做,就可以省去自己的麻烦。

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