问题描述
我尝试设置一个 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
您必须进行测试,直到根据脚本的要求定义了所有必要的变量。