为什么 cron 作业会产生零长度文件这个问题的每个答案都可以归结为使用经典的输出重定向。这仍然没有帮助,在这里。
# cat /etc/cron.d/aide
SHELL=/bin/bash
48 22 * * * root /usr/sbin/aide --check >/var/log/dailys/aide-$( date +\%Y\%m\%d ).out 2>&1
我只会得到一个零长度的文件。如果我拉出该命令并在 bash 提示符下运行它(删除反斜杠),我会得到一个已填充的文件。
更新1
@鲁迪迈尔建议使用 strace 来跟踪我的文件描述符。那失败了,但是以有趣的方式。
# cat /etc/cron.d/aide
SHELL=/bin/bash
21 13 * * * root strace /usr/sbin/aide --check >/var/log/dailys/aide-$( date +\%Y\%m\%d ).out 2>/var/log/dailys/strace.out
作业运行了,aide 运行没有输出,strace 向我显示文件描述符分配以 3 开头。唯一的参考是/var/log/dailys
aide 检查目录中文件的权限和内容时。所以,我尝试了其他方法:让我们启动 cron 作业,并查看各种进程文件描述符。我最终不得不快一点才能完成这一切,并且这个伎俩我口袋里的东西给了我更多后续线索。
# ps -ef | grep aide
root 27794 27792 <stuff> /bin/bash -c /usr/sbin/aide --check > /var/log/dailys/aide-$( date +%Y%m%d ).out 2>&1
root 27795 27794 <stuff> /usr/sbin/aide --check
# ls -l /proc/27794/fd
lr-x------. <stuff> 0 -> pipe:[14123645]
l-wx------. <stuff> 1 -> pipe:[14123646]
l-wx------. <stuff> 2 -> pipe:[14123646]
# ls -l /proc/27795/fd
lr-x------. <stuff> 0 -> pipe:[14123645]
lrwx------. <stuff> 1 -> /null
lrwx------. <stuff> 2 -> /null
<stuff>
# ls -l /proc/27792/fd
lrwx------. <stuff> 0 -> /dev/null
lrwx------. <stuff> 1 -> /dev/null
lrwx------. <stuff> 2 -> /dev/null
lr-x------. <stuff> 5 -> anon_inode:inotify
lr-x------. <stuff> 6 -> pipe:[14123646]
# ps -ef | grep 27792
root 27792 3850 <stuff> CROND
<stuff>
# ps -ef | grep 3850
root 3850 1 <stuff> crond
<stuff>
因此,辅助进程的 STDOUT 和 STDERR 被定向到/null
,父bash
shell 正在写入它是父母。顶级进程CROND
没有可写的 FD。而且,我不知道哪个进程可能/var/log/dailys/aide-20170803.out
首先创建为空文件。越来越好奇……
更新2
这一切都始于迪萨斯蒂格 RHEL-07-020030,/usr/sbin/aide --check 2>&1 | /bin/mail ...
我已经对此进行了测试并且知道它有效。为什么使用管道而不是输出重定向?
我回到管道到邮件版本并扫描了 PID 和 FD。通过 bash 管道排列,aide
实际上通过管道填充 FD 1 和 FD2,而不是返回到其父级。那么,让我们玩一会儿吧...
# cat /etc/cron.d/aide
SHELL=/bin/bash
41 14 * * * root /usr/sbin/aide --check | tee /var/log/dailys/aide-$( date +%\Y\%m\%d ).out 1>/dev/null 2>&1
这有效......我有一种微弱的感觉,aide
除了通过管道之外,代码还阻止输出重定向。当我的 24 小时结束时,我会写出解决方案。
答案1
您正在使用 selinux。如果你“setenforce 0”然后让 cron 运行,你将得到你期望的输出。在 root shell 中,您的 selinux 上下文是:
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
但是当从 Cron 运行时,你的 selinux 上下文开始为:
system_u:system_r:system_cronjob_t:s0-s0:c0.c1023
|
到另一个命令有效,所以你也可以这样做| cat > file
aide 然后用 selinux 做它自己的事情,这会导致重定向失败。