通常,crontab
脚本不会按计划或按预期执行。原因有很多:
- 错误的 crontab 符号
- 权限问题
- 环境变量
该社区 wiki 旨在汇总crontab
脚本未按预期执行的主要原因。将每个原因写在单独的答案中。
请在每个答案中包含一个原因-有关未执行原因的详细信息-并针对该原因进行修复。
请只编写特定于 cron 的问题,例如从 shell 中按预期执行但由 cron 错误执行的命令。
通常,crontab
脚本不会按计划或按预期执行。原因有很多:
该社区 wiki 旨在汇总crontab
脚本未按预期执行的主要原因。将每个原因写在单独的答案中。
请在每个答案中包含一个原因-有关未执行原因的详细信息-并针对该原因进行修复。
请只编写特定于 cron 的问题,例如从 shell 中按预期执行但由 cron 错误执行的命令。
不同的环境
Cron 将一组最小的环境变量传递给您的作业。要查看差异,请添加如下虚拟作业:
等待
/tmp/env.output
创建,然后再次删除作业。现在将 的内容与常规终端/tmp/env.output
中运行的输出进行比较。env
这里一个常见的“陷阱”是
PATH
环境变量不同。也许您的 cron 脚本使用了您在 中添加somecommand
的命令?cron 会忽略该文件,因此当使用 cron 运行时,从脚本运行会失败,但在终端中运行时会起作用。值得注意的是,变量 from将被传递给 cron 作业,而不是 cron 专门设置自己的变量,例如./opt/someApp/bin
PATH
/etc/environment
PATH
somecommand
/etc/environment
PATH
要解决这个问题,只需
PATH
在脚本顶部设置您自己的变量。例如有些人更喜欢只使用所有命令的绝对路径。我建议反对。考虑一下如果你想在不同的系统上运行你的脚本会发生什么,而在那个系统上,该命令是
/opt/someAppv2.2/bin
代替的。您必须完成整个脚本替换/opt/someApp/bin
,/opt/someAppv2.2/bin
而不是仅在脚本的第一行进行小编辑。您还可以在 crontab 文件中设置 PATH 变量,该变量将应用于所有 cron 作业。例如
我的首要问题:如果您忘记在
crontab
文件末尾添加换行符。换句话说,crontab 文件应该以空行结束。以下是此问题手册页中的相关部分(
man crontab
然后跳到最后):Cron 守护程序未运行。几个月前我真的搞砸了。
类型:
如果你没有看到数字(即 cron 的主 PID),那么 cron 没有运行。
sudo /etc/init.d/cron start
可以用来启动cron。编辑:不要通过 /etc/init.d 调用初始化脚本,而是使用服务实用程序,例如
编辑:您也可以在现代 Linux 中使用 systemctl,例如
cron.d/
,cron.daily/
,cron.hourly/
等中的脚本文件名不应包含点(.
),否则运行部分将跳过它们。参见运行部分(8):
所以,如果你有一个 cron 脚本
backup.sh
,analyze-logs.pl
在cron.daily/
目录中,你最好删除扩展名。在许多环境中,cron 使用 执行命令
sh
,而许多人认为它会使用bash
.针对失败的命令测试或修复此问题的建议:
尝试运行命令
sh
以查看它是否有效:将命令包装在 bash 子 shell 中,以确保它在 bash 中运行:
通过在 crontab 顶部设置 shell 来告诉 cron 在 bash 中运行所有命令:
如果命令是脚本,请确保脚本包含 shebang:
我在时区方面遇到了一些问题。Cron 以全新安装时区运行。解决方案是重新启动 cron:
脚本应使用绝对路径:
例如,
/bin/grep
应该使用而不是grep
:代替:
这特别棘手,因为从 shell 执行相同的命令时会起作用。原因是与用户
cron
没有相同的PATH
环境变量。如果您的 crontab 命令中有一个
%
符号,cron 会尝试解释它。因此,如果您使用任何带有 a%
的命令(例如 date 命令的格式规范),您将需要对其进行转义。这和其他好的陷阱在这里: http:
//www.pantz.org/software/cron/croninfo.html
Cron 正在调用一个不可执行的脚本。
通过运行
chmod +x /path/to/script
,脚本变为可执行,这应该可以解决此问题。用户的密码也可能已过期。甚至 root 的密码也会过期。你可以
tail -f /var/log/cron.log
,你会看到 cron 失败,密码过期。您可以通过执行以下操作将密码设置为永不过期:passwd -x -1 <username>
在某些系统(Debian、Ubuntu)中,默认情况下不启用 cron 日志记录。在/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf行:
应编辑 (
sudo nano /etc/rsyslog.conf
) 取消注释:之后,您需要通过以下方式重新启动 rsyslog
或者
来源:在 Debian Linux 中启用 crontab 日志记录
在某些系统(Ubuntu)中,默认情况下不启用单独的 cron 日志文件,但与 cron 相关的日志出现在 syslog 文件中。一个可以使用
查看与 cron 相关的消息。