crontab
脚本没有按计划或预期执行。出现这种情况的原因有很多:
- 错误的crontab标记
- 权限问题
- 环境变量
crontab
脚本未按预期执行的主要原因。请将每个原因写在单独的答案中。请每个答案只写一个原因 - 关于为什么没有执行的详细信息 - 以及针对该原因的修复方法。
请仅编写与cron特定的问题,例如从shell正常执行但通过cron错误执行的命令。
crontab
脚本没有按计划或预期执行。出现这种情况的原因有很多:
crontab
脚本未按预期执行的主要原因。请将每个原因写在单独的答案中。不同的环境
Cron将一组最小的环境变量传递给您的作业。要查看差异,请添加一个类似这样的虚拟作业:
* * * * * env > /tmp/env.output
等待/tmp/env.output
被创建,然后再删除该作业。现在将/tmp/env.output
的内容与在常规终端中运行env
命令的输出进行比较。
这里一个常见的问题是PATH
环境变量的不同。也许您的cron脚本使用了在/opt/someApp/bin
中找到的somecommand
命令,并且您已经将其添加到/etc/environment
的PATH
中?cron会忽略来自该文件的PATH
,因此在使用cron运行脚本时,从脚本中运行somecommand
将失败,但在终端中运行时却可以正常工作。值得注意的是,来自/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
,而不仅仅是在脚本的第一行进行小的编辑。PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
15 1 * * * backupscript --incremental /home /root
env
,我完全忘记了那个命令,并且以为 PATH 是有效的。实际上,在我的情况下稍微有点不同。 - Izkatascripts
而不是scritps
? - geirha/opt/someApp/bin
添加到PATH环境变量时,最好是添加到末尾而不是开头。提前编辑完成。 - ulidtko/opt/someApp/bin
中的可执行文件优先于其他目录中具有相同名称的命令。这个顺序是有意为之的。 - geirha/opt
风格命名的软件包通常并非旨在覆盖系统命令,它们通常提供自己独特的命令名称。这意味着它们在PATH
的末尾是可以接受的。然而,正如@pbr所合理地指出的那样,故意覆盖系统命令很可能是恶意软件的特征。个人而言,我更倾向于默认选择安全方案(即将其放在PATH
的末尾),只有在完全检查软件包/目录内容并且确实有合适的覆盖动机之后,才将其移到前面。 - ulidtko/usr/bin
目录下安装了一个与someApp中使用的命令同名但功能完全不同的命令时,cronjob突然停止工作。这可能会产生灾难性的影响。显然,你必须相信/opt/someApp/bin
目录中的命令没有恶意行为。如果那里面有恶意命令,系统管理员的工作就做得不好。 - geirha* * * * * source ~/.bashrc; command
来获取与我的正常登录会话相同的环境设置。 - mcfedrPATH=/usr/sbin
无法工作。我必须执行export PATH=/usr/sbin
。 - PouJacrontab
文件的末尾添加换行符。换句话说,crontab文件应该以空行结尾。man crontab
然后跳到最后): Although cron requires that each entry in a crontab end in a newline
character, neither the crontab command nor the cron daemon will detect
this error. Instead, the crontab will appear to load normally. However,
the command will never run. The best choice is to ensure that your
crontab has a blank line at the end.
4th Berkeley Distribution 29 December 1993 CRONTAB(1)
man crontab
表示"cron要求crontab中的每个条目以换行符结尾。如果最后一个条目缺少换行符,cron将认为crontab(至少部分)已损坏并拒绝安装它。"(并且日期在2010年4月19日)。 - Marius Gedminascrontab -e
编辑 crontab,它会在允许保存之前检查文件的语法,包括换行符的检查。 - Tom Harrison Jr-e
选项编辑并保存crontab时触发,并且与编辑器无关。 - Tom Harrison Jrcrontab -e
没有告诉我没有换行符的情况。只需要在行末按下回车键,然后保存就可以了! - Terrancepgrep cron
sudo /etc/init.d/cron start
来启动cron。
编辑:与其通过/etc/init.d调用init脚本,建议使用service实用程序,例如:
sudo service cron start
sudo systemctl start cron
pidof cron
,这将省略其他同样带有'cron'这个词的应用程序(如crontab)的结果。 - Pithikossudo service cron start
,我会得到 start: Job is already running: cron
。 - Colleenservice crond start
。 - Srihari Karanth.
),否则run-parts将跳过它们。 If neither the --lsbsysinit option nor the --regex option is given then
the names must consist entirely of upper and lower case letters, dig‐
its, underscores, and hyphens.
If the --lsbsysinit option is given, then the names must not end in
.dpkg-old or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong to
one or more of the following namespaces: the LANANA-assigned namespace
(^[a-z0-9]+$); the LSB hierarchical and reserved namespaces
(^_?([a-z0-9_.]+-)+[a-z0-9]+$); and the Debian cron script namespace
(^[a-zA-Z0-9_-]+$).
run-parts --test
(或者其他类似--debug
的虚构选项)能够输出跳过的文件及其原因,那么对于调试来说会很有帮助。 - Rabarberskipull-data.sh
也永远不会执行:/bin/bash /home/userName/pull-data.sh? - RodrikTheReadersh
来执行命令,而很多人却认为它会使用bash
。尝试在sh
中运行命令,看看是否有效:
sh -c "mycommand"
将命令包装在bash子shell中,以确保在bash中运行:
bash -c "mybashcommand"
通过在crontab顶部设置shell,告诉cron在bash中运行所有命令:
SHELL=/bin/bash
如果命令是一个脚本,请确保脚本包含shebang:
#!/bin/bash
bash
,但在cron
中却不行。谢谢! - Hendysource
命令,但在sh中没有。在cron/sh中,应该使用点号:. envfile
而不是source envfile
。 - kungphush "mycommand"
告诉 sh
以脚本文件的形式运行 mycommand。你是不是想说 sh -c "mycommand"
?无论如何,这个回答似乎是关于让命令在 bash 中运行的,所以为什么在这里添加了 sh
的命令呢? - Olorinsudo service cron restart
* * * * * touch /tmp/cronworks
,却没有任何效果,但是cronlog中确实有RELOAD
。 - Evgeniy Chekan/bin/grep
而不是grep
。# m h dom mon dow command
0 0 * * * /bin/grep ERROR /home/adam/run.log &> /tmp/errors
不是:
# m h dom mon dow command
0 0 * * * grep ERROR /home/adam/run.log &> /tmp/errors
/usr/bin/whatever
路径。 - Anentropicchmod +x /path/to/script
,脚本变得可执行,这应该解决这个问题。cron
的问题,只需在命令行中尝试执行/path/to/script
即可轻松追踪到。 - Adam Matan. scriptname
或sh scriptname
或bash scriptname
执行脚本,那么这就成为一个“cron”特定的问题。 - Eliah Kagan用户的密码可能已过期。即使是root的密码也可以过期。您可以使用tail -f /var/log/cron.log
命令查看cron失败并显示密码已过期。您可以通过执行以下操作将密码设置为永不过期:passwd -x -1 <用户名>
在某些系统(Debian,Ubuntu)中,默认情况下未启用cron的日志记录。在/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf文件中,找到以下行:
# cron.* /var/log/cron.log
sudo nano /etc/rsyslog.conf
)取消注释为:cron.* /var/log/cron.log
/etc/init.d/rsyslog restart
或者
service rsyslog restart
来源:在Debian Linux中启用crontab日志记录
在一些系统(如Ubuntu)中,默认情况下未启用cron的单独日志文件,但与cron相关的日志会出现在syslog文件中。您可以使用以下方法
cat /var/log/syslog | grep cron -i
crontab -e
以使cron生效。例如,使用vim编辑文件并使用:w
保存,但是直到退出后,作业才会添加到cron中。因此,在我也执行:q
之前,我将看不到该作业。 - DutGRIFF