我通过输入crontab -e在ubuntu环境中为root用户设置了cronjob
34 11 * * * sh /srv/www/live/CronJobs/daily.sh
0 08 * * 2 sh /srv/www/live/CronJobs/weekly.sh
0 08 1 * * sh /srv/www/live/CronJobs/monthly.sh
但是cronjon不会跑 . 我已经尝试检查cronjob是否正在运行
pgrep cron
并提供进程ID 3033. shell脚本调用python文件,用于发送电子邮件 . 运行python文件是可以的 . 它没有错误,但是cron没有运行 . daily.sh文件中包含以下代码 .
python /srv/www/live/CronJobs/daily.py
python /srv/www/live/CronJobs/notification_email.py
python /srv/www/live/CronJobs/log_kpi.py
8 回答
WTF?! My cronjob doesn't run?!
这是一个调试不运行cronjobs的清单指南:
Cron守护程序是否正在运行?
运行
ps ax | grep cron
并寻找cron .Debian:
service cron start
或service cron restart
cron工作了吗?
* * * * * /bin/echo "cron works" >> /tmp/file
语法正确吗?见下文 .
您显然需要对要将输出重定向到的文件具有写访问权限 .
/tmp
中当前不存在的唯一文件名应始终可写 .该命令是否独立运行?
通过在CLI上执行干运行来检查脚本是否有错误
在测试命令时,请测试您正在编辑其crontab的用户,该用户可能不是您的登录名或root用户
cron可以运行你的工作吗?
检查
/var/log/cron.log
或/var/log/messages
是否有错误 .Ubuntu:
grep CRON /var/log/syslog
Redhat:
/var/log/cron
检查权限
在命令上设置可执行标志:
chmod +x /var/www/app/cron/do-stuff.php
如果将命令输出重定向到文件,请验证您是否有权写入该文件/目录
检查路径
检查she-bangs / hashbangs行
不依赖于像PATH这样的环境变量,因为它们的值在cron下可能与交互式会话中的值不同
调试时不要抑制输出
常用的是这种抑制:
30 1 * * * command > /dev/null 2>&1
重新启用标准输出或标准错误消息输出
Still not working? Yikes!
提高cron调试级别
Debian
in
/etc/default/cron
设置
EXTRA_OPTS="-L 2"
service cron restart
tail -f /var/log/syslog
查看执行的脚本Ubuntu
in
/etc/rsyslog.d/50-default.conf
添加或注释掉行
cron.crit /var/log/cron.log
重装 Logger
sudo /etc/init.d/rsyslog reload
重新运行cron
打开
/var/log/cron.log
并查找详细的错误输出提醒:完成调试后,停用日志级别
再次运行cron并检查日志文件
Cronjob Syntax
对于
root
用户,此语法是 only 正确 . 普通用户crontab
语法没有User字段(不允许普通用户像其他任何用户一样运行代码);Crontab Commands
crontab -l
列出所有用户的cron任务 .
crontab -e
,针对特定用户:crontab -e -u agentsmith
开始编辑crontab文件的会话 .
退出编辑器时,会自动安装修改过的crontab .
crontab -r
从cron假脱机程序中删除crontab条目,但不从crontab文件中删除 .
最后我找到了解决方案 . 以下是解决方案: -
crontab失败的另一个原因:
%
字符的特殊处理 .来自man file:
在我的特定情况下,我使用
date --date="7 days ago" "+%Y-%m-%d"
为我的脚本生成参数,并且它无声地失败 . 当我检查syslog
并看到我的命令在%
符号被截断时,我终于发现了发生了什么 . 你需要像这样逃避它:有关详细信息,请参见此处
http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/
我想加上我学到的2分:
放在/etc/cron.d/中的
Cron配置文件不应包含点( . ) . 否则,cron将不会读取它 .
如果运行命令的用户不在/ etc / shadow中 . 它不会被允许安排cron .
Refs:
http://manpages.ubuntu.com/manpages/xenial/en/man8/cron.8.html
https://help.ubuntu.com/community/CronHowto
我发现用户的crontab没有运行的另一个原因是:hosts文件中没有主机名:
现在主机文件:
这是在Ubuntu 14.04.3 LTS上,修复它的方法是 adding the hostname to the hosts file 所以它类似于这样:
对我来说,解决方案是cron尝试运行的文件位于加密目录中,更具体地说是/ home /上的用户指令 . 虽然crontab配置为root,因为在/ home / cron中的加密用户目录中运行的脚本只能在用户实际登录时读取此目录 . 要查看目录是否已加密,请检查此目录是否存在:
如果是这样,那么你有一个加密的主目录 .
我的修复是将脚本移动到非加密目录,everythig工作正常 .
我遇到了同样的问题,其中crons没有运行 . 我们通过改变权限和所有者来修复Crons做了root用户,就像我们在crontab和Cronjobs 644中给出的那样
有时cron需要运行的命令位于cron无法访问的目录中,通常在用户的主目录权限为700且命令在该目录中的系统上 .