问题描述
我创建了 3 个每日 cron 作业来运行。
以下是放置在 etc/cron.daily 中的三个
猎头者sh
#!/bin/sh
(
rkhunter --versioncheck
rkhunter --update
rkhunter --cronjob --report-warnings-only
) | mail -s 'rkhunter Daily Run (my server)' [email protected]
chkrootkit.sh
#!/bin/bash
chkrootkit | mail -s "chkrootkit Daily Run (my server)" [email protected]
日志观察工具
#!/bin/sh
(
logwatch
) | mail -s 'logwatch Daily Log (my server)' [email protected]
当然,我用我的电子邮件替换了 [email\xa0protected]。
如果我手动运行这个 cronjob,它可以正常工作 ./nameoffile.sh
但它并不是每天运行,可能是什么原因或者我该如何检查?
最佳方法
根据this响应,问题出在.sh扩展名上。删除它(例如将文件从 rkhunter.sh 重命名为 rkhunter.sh)
要确认,请运行以下命令 run-parts --test /etc/cron.daily
如果您的脚本 (rkhunter) 包含在结果中,则一切都很好。有关 run-parts 命令的更多信息,请阅读其手册页 man run-parts
次佳方法
在我的系统中,这是因为没有安装 anacron。
grep run-parts /etc/crontab
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
因此要么安装 anacron 要么删除 test -x /usr/sbin/anacron
第三种方法
我认为带有扩展名的文件会被忽略。
跑步:
run-parts --test /etc/cron.daily
如果您没有看到列出的脚本,请删除 .sh 扩展名并重试。
第四种方法
添加到 Stef 答案中,您还应该确保它们具有可执行位:
$ ls -l
-rwxr-xr-x 1 root root 268 Jun 1 08:06 00logwatch
-rwxr-xr-x 1 root root 311 May 22 2012 0anacron
-rwxr-xr-x 1 root root 15007 Jun 6 14:08 apt
您应该能够使用 chmod +x filename
运行它们。
第五种方法
有两种可能的嫌疑通常会导致 cron
作业无法运行。
首先是权限问题,即用户可以运行脚本/命令,但 cron 守护程序不能运行,因为该作业位于错误用户的 cron 作业中。例如,用户使用提升的权限创建脚本或运行命令,即使用 sudo
,然后将测试的脚本/命令添加到其 cron 作业列表 ( crontab
)。结果是用户的 cron 作业将无法运行,因为它需要提升的权限。
-
要将 cron 作业放入当前用户的 crontab 中,请输入
crontab -e
-
要将 cron 作业放入 root 的 crontab 中,请输入
sudo crontab -e
第二个原因是路径,为了确保脚本能够执行,用户必须在 crontab 中添加要执行的脚本的完整路径。另一个解决方案是通过将以下行放在 crontab 文件的顶部来扩展 root 用户的 PATH 变量:
PATH=/usr/sbin:/usr/bin:/sbin:/bin
作为社区维基 mentions 。
您可能需要阅读有关 cron 的 community wiki,因为它提供了有关上述内容的更多详细信息。
第六种方法
将文件重命名为不包含 .sh 扩展名
要验证这是否是问题所在,请尝试
sudo run-parts --list /etc/cron.daily
你会看到它没有列出。所以运行:
mv script.sh script
并尝试再次列出。应该列出来。