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

标签 bash inotify centos6 selinux

我已经从 EPEL 存储库安装了 incron(在你问之前;是的,我也尝试下载源代码并在本地编译;相同的结果)并试图在我的 CentOS 6.4(最终版)虚拟盒子上设置一个进程,我已在我本地的 Ubunto 12.04 机器上成功制作原型(prototype):

前面的一些信息:

  • SELinux 设置为 PERMISSIVE
  • 我已经使用 visudo 使用 NOPASSWD 添加我的脚本并调用可执行文件来解决一些权限问题...

如果我使用 sudo/path/to/my/script.sh arguments 从命令行调用我的脚本,它就像一个魅力。

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/ 中的事件不会导致任何事情发生。文件夹中的文件不会生成任何日志、任何消息、任何操作。

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

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

编辑: 文档表明 incron 从系统表运行或根从其主机环境中获取 env,因此只有 incron 由非root 用户应该需要任何类型的 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 yields 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 结果。

  • 感谢修复我的垃圾格式化工作

最佳答案

好的,这是答案:

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

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

最重要的是,它现在起作用了,耶!

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

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

关于bash - incrond在CentOS 6.4下运行但不执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18238962/

相关文章:

bash - 在 bash 中进行 Ascii/Hex 转换

java - Windows 10-使用bash终端将Java和Maven设置为环境和系统变量

linux - 如何在功能测试中模拟 INotify 失败?

docker 检查挂载文件系统的变化

bash - 代表标准输入的 '-' 是否有特定名称?

bash - 如何使 shell 脚本所做的更改永久生效?

linux - 使用 Inotify 检测复制操作

php - yum install php-mysql 无法安装Centos

amazon-web-services - 我可以在带有 vagrant 的 aws 上使用哪个 centos 图像?

java - 森托斯 6 : Java Application not Logging to var/log