我在ubuntu环境中为root用户设置了cronjob,方法是输入crontab -e
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
答案 0 :(得分:95)
<强> WTF?我的cronjob没有运行?
这是一个调试不运行cronjobs的清单指南:
ps ax | grep cron
并查找cron。service cron start
或service cron restart
* * * * * /bin/echo "cron works" >> /tmp/file
/tmp
中当前不存在的唯一文件名应始终可写。/var/log/cron.log
或/var/log/messages
是否有错误。grep CRON /var/log/syslog
/var/log/cron
chmod +x /var/www/app/cron/do-stuff.php
30 1 * * * command > /dev/null 2>&1
仍然无法正常工作?糟糕!强>
/etc/default/cron
EXTRA_OPTS="-L 2"
service cron restart
tail -f /var/log/syslog
查看已执行的脚本/etc/rsyslog.d/50-default.conf
cron.crit /var/log/cron.log
sudo /etc/init.d/rsyslog reload
/var/log/cron.log
并查找详细的错误输出Cronjob语法
# Minute Hour Day of Month Month Day of Week User Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 * * * root /usr/bin/find
root
用户的此语法仅正确。常规用户crontab
语法没有用户字段(不允许普通用户像其他任何用户一样运行代码);
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 * * * /usr/bin/find
Crontab命令
crontab -l
crontab -e
,针对特定用户:crontab -e -u agentsmith
crontab -r
答案 1 :(得分:6)
最后我找到了解决方案。以下是解决方案: -
永远不要在python脚本中使用相对路径来通过crontab执行。 我做了类似的事情: -
import os
import sys
import time, datetime
CLASS_PATH = '/srv/www/live/mainapp/classes'
SETTINGS_PATH = '/srv/www/live/foodtrade'
sys.path.insert(0, CLASS_PATH)
sys.path.insert(1,SETTINGS_PATH)
import other_py_files
永远不要压缩crontab代码,而是使用mailserver并检查用户的邮件。这样可以更清楚地了解目前的情况。
答案 2 :(得分:4)
crontab失败的另一个原因:%
字符的特殊处理。
来自man file:
The entire command portion of the line, up to a newline or a
"%" character, will be executed by /bin/sh or by the shell specified
in the SHELL variable of the cronfile. A "%" character in the
command, unless escaped with a backslash (\), will be changed into
newline characters, and all data after the first % will be sent to
the command as standard input.
在我的特定情况下,我使用date --date="7 days ago" "+%Y-%m-%d"
为我的脚本生成参数,并且它以静默方式失败。当我检查syslog
并看到我的命令被%
符号截断时,我终于知道发生了什么。你需要像这样逃避它:
date --date="7 days ago" "+\%Y-\%m-\%d"
请点击此处了解更多详情:
http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/
答案 3 :(得分:1)
我想加上我学到的2分:
<强>参考文献:强>
答案 4 :(得分:1)
这也可能是时区问题。
Cron使用当地时间。
运行命令timedatectl
以查看机器时间,并确保您的crontab处于同一时区。
答案 5 :(得分:1)
已经有很多答案了,但没有一个对我有帮助,所以我会在这里添加我的,以防对其他人有用。
在我的情况下,我的 cronjobs 一直在工作,直到出现电力短缺,切断了我的 Raspberry Pi 的电源。 Cron 损坏了。我认为正是在短缺发生时它正在运行一个很长的 python 脚本。上面的主要答案中没有任何内容对我有用。然而,解决方案非常简单。我只需要强制重新安装 cron:
sudo apt-get --reinstall install cron
此后立即生效。
答案 6 :(得分:0)
我发现用户的crontab没有运行的另一个原因:hosts文件中没有主机名:
user@ubuntu:~$ cat /etc/hostname
ubuntu
现在主机文件:
user@ubuntu:~$ cat /etc/hosts
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
这是在Ubuntu 14.04.3 LTS上,修复它的方法是将主机名添加到hosts文件,所以它类似于:
user@ubuntu:~$ cat /etc/hosts
127.0.0.1 ubuntu localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
答案 7 :(得分:0)
对我来说,解决方案是cron尝试运行的文件位于加密目录中,更具体地说是/ home /上的用户指令。尽管crontab配置为root,但因为在/ home / cron中的加密用户目录中运行的脚本只能在用户实际登录时读取此目录。要查看目录是否已加密,请检查此目录是否存在:
/home/.ecryptfs/<yourusername>
如果是,那么你有一个加密的主目录。
我的修复方法是将脚本移动到非加密目录中,并且每个工作都正常。
答案 8 :(得分:0)
我遇到了同样的问题,即crons没有运行。 我们通过更改权限和所有者来修复 正如我们在crontab AND中提到的那样,Crons成为了root用户 给予Cronjobs 644许可
答案 9 :(得分:0)
我在Alpine映像中具有cronjob作为docker,并为curl命令添加了程序包。我添加了crontab命令,但作业未运行。
Crontab -e
* * * * * /usr/bin/curl -v http://www.google.com/ >> /var/log/cron/cron.log 2>&1
* * * * * /usr/bin/curl http://dummy.restapiexample.com/api/v1/employees >> /var/log/cron/cron.log
* * * * * /bin/date >> /var/log/cron/cron.log
# Leave one blank line below or cron will fail
但是在日志文件中没有log。如何检查为什么没有开始?
答案 10 :(得分:0)
我通过运行以下命令在Ubuntu 16.04服务器上找到了有用的调试信息:
systemctl status cron.service
在我的情况下,我被告知我在备注行旁留下了注释“#”:
Aug 18 19:12:01 is-feb19 cron[14307]: Error: bad minute; while reading /etc/crontab
Aug 18 19:12:01 is-feb19 cron[14307]: (*system*) ERROR (Syntax error, this crontab file will be ignored)
答案 11 :(得分:0)
要添加另一点,/ etc / cron.d中的文件末尾必须包含一个空的新行。这可能与Luciano的答复有关,该答复指出:
The entire command portion of the line, up to a newline or a "%"
character, will be executed
答案 12 :(得分:0)
我遇到了与以下链接类似的问题。
similar to my problem
my original post
我的问题是 cron / crontab 不会执行我的 bash 脚本。那个 bash 脚本执行了一个 python 脚本。
#!/bin/bash
python /home/frosty/code/test_scripts/test.py
from datetime import datetime
def main():
dt_now = datetime.now()
string_now = dt_now.strftime('%Y-%m-%d %H:%M:%S.%f')
with open('./text_file.txt', 'a') as f:
f.write(f'wrote at {string_now}\n')
return None
if __name__ == '__main__':
main()
File "/home/frosty/code/test_scripts/test.py", line 7
string_to_write = f'wrote at {string_now}\n'
^
SyntaxError: invalid syntax
这个错误没有意义,因为从 bash 文件和 python 文件中执行的代码没有错误。
** 注意 -> 确保在 crontab -e
文件中不要抑制输出。我通过在命令后添加 >>/path/to/cron/output/file.log 2>&1
将输出发送到文件。下面是我的 crontab -e 条目
*/5 * * * * /home/frosty/code/test_scripts/echo_message_sh >>/home/frosty/code/test_scripts/cron_out.log 2>&1
cron 使用了错误的 python 解释器,可能是语法错误导致的 python 2。
我将我的 bash 文件更改为以下内容
#!/bin/bash
conda_shell=/home/frosty/anaconda3/etc/profile.d/conda.sh
conda_env=base
source ${conda_shell}
conda activate ${conda_env}
python /home/frosty/code/test_scripts/test.py
我将我的python文件更改为以下内容
from datetime import datetime
def main():
dt_now = datetime.now()
string_now = dt_now.strftime('%Y-%m-%d %H:%M:%S.%f')
string_file = '/home/frosty/code/test_scripts/text_file.txt'
string_to_write = 'wrote at {}\n'.format(string_now)
with open(string_file, 'a') as f:
f.write(string_to_write)
return None
if __name__ == '__main__':
main()
答案 13 :(得分:-2)
有时cron需要运行的命令位于cron无法访问的目录中,通常是在用户&#39;主目录&#39;权限为700,命令在该目录中。