如何正确设置 root cron 作业

Ant*_*nio 47 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
Run Code Online (Sandbox Code Playgroud)

此 Bash 脚本可在此处获得

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

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

sudo crontab -e
Run Code Online (Sandbox Code Playgroud)

并在最后插入这两行。我希望 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

sudo /usr/bin/tunlrupdate.sh
Run Code Online (Sandbox Code Playgroud)

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

为什么这个 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)
Run Code Online (Sandbox Code Playgroud)

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

经过一番搜索我准确定位文件中的错误/usr/lib/php5/maxlifetime的解释在这里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)
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
exit 0
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*ume 89

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

crontab -e
Run Code Online (Sandbox Code Playgroud)

并添加以下行:

07,37 * * * * /usr/bin/tunlrupdate.sh
Run Code Online (Sandbox Code Playgroud)

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

sudo crontab -e
Run Code Online (Sandbox Code Playgroud)

并添加相同的行:

07,37 * * * * /usr/bin/tunlrupdate.sh
Run Code Online (Sandbox Code Playgroud)


Ant*_*nio 11

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

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Run Code Online (Sandbox Code Playgroud)

这听起来像 root 未被识别为 cmd。因为我已经通过使用$ sudo /usr/bin/tunlrupdate.sh. 然后我尝试使用原始脚本(纠正了日期 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
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*lke 5

cron 的一个“问题”是缺乏环境变量(出于明显的安全原因)。您可能缺少 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
Run Code Online (Sandbox Code Playgroud)

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