首页 文章

CronJob没有运行

提问于
浏览
25

我通过输入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 回答

  • 4

    WTF?! My cronjob doesn't run?!

    这是一个调试不运行cronjobs的清单指南:

    • Cron守护程序是否正在运行?

    • 运行 ps ax | grep cron 并寻找cron .

    • Debian: service cron startservice 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

    # 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 用户,此语法是 only 正确 . 普通用户 crontab 语法没有User字段(不允许普通用户像其他任何用户一样运行代码);

    # 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 Commands

    • crontab -l

    • 列出所有用户的cron任务 .

    • crontab -e ,针对特定用户: crontab -e -u agentsmith

    • 开始编辑crontab文件的会话 .

    • 退出编辑器时,会自动安装修改过的crontab .

    • crontab -r

    • 从cron假脱机程序中删除crontab条目,但不从crontab文件中删除 .

  • 0

    最后我找到了解决方案 . 以下是解决方案: -

    • 永远不要在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并检查用户的邮件 . 这样可以更清晰地了解正在发生的事情 .
  • 6

    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/

  • -2

    我想加上我学到的2分:

    放在/etc/cron.d/中的

    • Cron配置文件不应包含点( . ) . 否则,cron将不会读取它 .

    • 如果运行命令的用户不在/ etc / shadow中 . 它不会被允许安排cron .

    Refs:

  • 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上,修复它的方法是 adding the hostname to the hosts file 所以它类似于这样:

    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
    
  • 1

    对我来说,解决方案是cron尝试运行的文件位于加密目录中,更具体地说是/ home /上的用户指令 . 虽然crontab配置为root,因为在/ home / cron中的加密用户目录中运行的脚本只能在用户实际登录时读取此目录 . 要查看目录是否已加密,请检查此目录是否存在:

    /home/.ecryptfs/<yourusername>
    

    如果是这样,那么你有一个加密的主目录 .

    我的修复是将脚本移动到非加密目录,everythig工作正常 .

  • 0

    我遇到了同样的问题,其中crons没有运行 . 我们通过改变权限和所有者来修复Crons做了root用户,就像我们在crontab和Cronjobs 644中给出的那样

  • 91

    有时cron需要运行的命令位于cron无法访问的目录中,通常在用户的主目录权限为700且命令在该目录中的系统上 .

相关问题