我尝试设置一个 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 的错误行。那是个错误]。
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)
您必须进行测试,直到按照脚本的要求定义了所有必要的变量。
| 归档时间: |
|
| 查看次数: |
309225 次 |
| 最近记录: |