通常,crontab
脚本未按计划执行或未按预期执行。这样做的原因有很多:
该社区Wiki旨在汇总crontab
未按预期执行脚本的主要原因。将每个原因写在单独的答案中。
请为每个答案提供一个原因-未执行原因的详细信息-并出于该原因进行修复。
请仅编写特定于cron的问题,例如,命令会在shell中按预期执行,但cron错误地执行。
不同的环境
Cron将最少的环境变量集传递给您的工作。要查看差异,请添加一个虚拟作业,如下所示:
* * * * * env> /tmp/env.output
等待/tmp/env.output
创建,然后再次删除作业。现在,将您的内容/tmp/env.output
与env
常规终端中run的输出进行比较。
这里常见的“陷阱”是PATH
环境变量不同。也许你的cron脚本使用命令somecommand
中发现/opt/someApp/bin
,你已经加入PATH
的/etc/environment
?cron会PATH
从该文件中忽略,因此somecommand
使用cron运行时从脚本运行将失败,但是在终端中运行时可以运行。值得注意的是,from的变量/etc/environment
将传递给cron作业,而不是cron专门设置的变量,例如PATH
。
为了解决这个问题,只需PATH
在脚本顶部设置您自己的变量。例如
#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# rest of script follows
有些人更喜欢只使用绝对路径访问所有命令。我建议反对。考虑如果要在另一个系统上运行脚本,并且在该系统上运行命令,会发生什么情况/opt/someAppv2.2/bin
。您必须将整个脚本替换为/opt/someApp/bin
,/opt/someAppv2.2/bin
而不仅仅是在脚本的第一行进行少量编辑。
您还可以在crontab文件中设置PATH变量,该变量将应用于所有cron作业。例如
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
15 1 * * * backupscript --incremental /home /root
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句