当前位置: 首页>>技术教程>>正文


如何正确设置 root cron 作业

问题描述

我尝试设置一个 root cron 作业来以 root 身份运行 Bash 脚本,在 7,37 分钟,每小时,每月的每一天,每月运行。该脚本位于 /usr/bin 并命名为 tunlrupdate.sh 。它更新 Tunlr 的 DNS。

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

此 Bash 脚本可用 here

调用时,脚本会在位于 /var/log/tunlr.log 的日志中写入正在发生的事情

为了添加这个 root cron 作业,我使用了 root 的 crontab 的标准

sudo crontab -e

并在最后插入这两行。我希望 cron 以 root 身份运行脚本。

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

稍后的命令 sudo crontab -l 确认已插入 cron 作业。

我确实重新启动了 Ubuntu 并正在检查日志文件是否正确启动了 cron 作业。但是,日志文件 /var/log/tunlr.log 中没有任何内容意味着该作业从未成功启动。

我确实检查过我是否从命令行运行脚本

sudo /usr/bin/tunlrupdate.sh

然后相应地更新日志文件。

为什么这个 cron 作业没有按计划在我的系统中运行?

更新 1:到目前为止,所有建议的解决方案都不起作用。我感谢 Olli 的 CLI 列出系统日志 sudo grep CRON /var/log/syslog 。但是我确实收到了 CRON 错误

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

使用建议的 PATH= 插入 &对脚本中的函数使用从 root 开始的绝对路径,或者在此处没有建议的解决方案。我仍然收到此错误。

经过一番搜索,我查明了文件 /usr/lib/php5/maxlifetime 中的错误,如 here 所述:Change #!/bin/sh -e --> #!/bin/sh -x

然后在我的系统中列出 CRON 错误日志

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

我仍然没有执行 bash 脚本。这次日志中没有显示错误。为了确保这不是脚本的内容,我将脚本缩减为以下 3 行:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

我仍然没有完成 cron 工作。日志文件中没有写入任何内容。所以即使是空脚本也不会在 cron 中运行?我不明白。我知道尝试将脚本简化为这两行:

#!/bin/bash
exit 0

并且仍然是相同的错误日志。 cron 脚本不通过…

最佳方法

如果您想以普通用户身份运行脚本:

crontab -e

并添加以下行:

07,37 * * * * /usr/bin/tunlrupdate.sh

如果您想以 root 身份运行脚本:

sudo crontab -e

并添加相同的行:

07,37 * * * * /usr/bin/tunlrupdate.sh

次佳方法

好吧,最后是可行的解决方案。在系统日志中,我看到了重复而有趣的内容:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

这听起来像 root 未被识别为 cmd。因为我已经通过使用 $ sudo /usr/bin/tunlrupdate.sh 使用了根的 cron 。然后我尝试使用原始脚本(更正了日期 UNIX cmd 中的错误:%m 是月份用于分钟,即 %M)以下(从 cron 行中删除根):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

结果证明这是最终的解决方案。 [虽然我发现有大量文献指出 cron 行中有 root 的错误行。那是个错误]。

第三种方法

一个带有 cron 的 “problem” 是缺少环境变量(出于明显的安全原因)。您可能缺少 PATH 和 HOME。您可以直接在脚本中或在 crontab 文件中定义它们。

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

您必须进行测试,直到根据脚本的要求定义了所有必要的变量。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12345.html,未经允许,请勿转载。