CronJob没有运行

ROB*_*ROB 31 linux crontab ubuntu-12.04

我通过输入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
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

Jen*_*och 109

WTF?我的cronjob不运行?!

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

  1. Cron守护程序是否正在运行?
    • 跑去ps ax | grep cron寻找cron.
    • Debian:service cron startservice cron restart
  2. cron工作吗?
    • * * * * * /bin/echo "cron works" >> /tmp/file
    • 语法正确吗?见下文.
    • 您显然需要对要将输出重定向到的文件具有写入权限./tmp当前不存在的唯一文件名应始终可写.
  3. 该命令是独立运行的吗?
    • 通过在CLI上执行干运行来检查脚本是否有错误
    • 在测试命令时,请测试您正在编辑其crontab的用户,该用户可能不是您的登录名或root用户
  4. cron可以运行你的工作吗?
    • 检查/var/log/cron.log/var/log/messages错误.
    • Ubuntu的: grep CRON /var/log/syslog
    • 红帽: /var/log/cron
  5. 检查权限
    • 在命令上设置可执行标志: chmod +x /var/www/app/cron/do-stuff.php
    • 如果将命令的输出重定向到文件,请验证您是否有权写入该文件/目录
  6. 检查路径
    • 检查她 - 刘海/ hashbangs线
    • 不要依赖像PATH这样的环境变量,因为它们的值在cron下可能与交互式会话中的值不同
  7. 调试时不要抑制输出
    • 常用的是这种抑制: 30 1 * * * command > /dev/null 2>&1
    • 重新启用标准输出或标准错误消息输出

还是行不通?哎呀!

  1. 提高cron调试级别
    • Debian的
      • >/dev/null 2>&1
      • >>cron.out 2>&1
      • cron.out
      • /etc/default/cron 看到执行的脚本
    • Ubuntu的
      • EXTRA_OPTS="-L 2"
      • 添加或注释掉行 service cron restart
      • 重新加载记录器 tail -f /var/log/syslog
      • 重新运行cron
      • 打开/etc/rsyslog.d/50-default.conf并查找详细的错误输出
    • 提醒:完成调试后,停用日志级别
  2. 运行cron并再次检查日志文件

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
Run Code Online (Sandbox Code Playgroud)

此语法仅对cron.crit /var/log/cron.log用户正确.常规用户sudo /etc/init.d/rsyslog reload语法没有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
Run Code Online (Sandbox Code Playgroud)

Crontab命令

  1. /var/log/cron.log
    • 列出所有用户的cron任务.
  2. root,对于特定用户: crontab
    • 启动crontab文件的编辑会话.
    • 退出编辑器时,将自动安装已修改的crontab.
  3. crontab -l
    • 从cron假脱机程序中删除crontab条目,但不从crontab文件中删除.

  • 这里应该包括几个额外的要点:1)在测试命令时,测试您正在编辑其crontab的用户,这可能不是您的登录名或root用户; 2)正如我上面提到的,最好不要依赖于像`PATH`这样的环境变量,因为它们的值在cron下可能与交互式会话中的值不同. (2认同)
  • 另外,请确保 cron 作业的用户没有过期的密码。 (2认同)
  • 添加另一个原因...系统时钟关闭 (2认同)

ROB*_*ROB 7

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

  1. 永远不要在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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 永远不要压缩crontab代码而是使用mailserver并检查用户的邮件.这样可以更清晰地了解正在发生的事情.


小智 6

我想补充两点我学到的:

  1. 放在 /etc/cron.d/ 中的 Cron 配置文件不应包含点 (.)。否则,它不会被 cron 读取。
  2. 如果运行您的命令的用户不在 /etc/shadow 中。不允许调度 cron。

参考:

  1. http://manpages.ubuntu.com/manpages/xenial/en/man8/cron.8.html
  2. https://help.ubuntu.com/community/CronHowto

  • 跳过名称中带有点的文件的约定扩展到任何`.d` 并且是一个实现细节,我想到了 Debian `run-parts` 脚本;所以这个建议可能是针对基于 Debian 的架构的。 (2认同)

Luc*_*ano 6

crontab失败的另一个原因:%字符的特殊处理。

man文件中

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.
Run Code Online (Sandbox Code Playgroud)

在我的特定情况下,我date --date="7 days ago" "+%Y-%m-%d"习惯于为脚本生成参数,并且它默默地失败了。当我检查syslog并看到命令在%符号处被截断时,我终于发现发生了什么。您需要这样逃避它:

date --date="7 days ago" "+\%Y-\%m-\%d"
Run Code Online (Sandbox Code Playgroud)

请参阅此处以获取更多详细信息:

http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/

  • 这正是我遇到的问题: `sh /path/script.sh /path/$(date +%Y-%m-%d).txt` 需要是: `sh /path/script.sh /path /$(日期 +\%Y-\%m-\%d).txt` (2认同)

归档时间:

查看次数:

83634 次

最近记录:

6 年,1 月 前