CronJob未运行

2024-04-20 02:52:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在ubuntu环境中为根用户设置了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

但克朗乔恩不跑。我试过用

pgrep cron公司

这个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

Tags: 文件用户pylive环境ubuntuwwwsh
3条回答

世界贸易基金会?!我的亲信不跑?!

以下是调试不运行cronjobs的清单指南:

  1. Cron守护进程正在运行吗?
    • 运行ps ax | grep cron并查找cron。
    • 借方:service cron startservice cron restart
  2. 克朗在工作吗?
    • * * * * * /bin/echo "cron works" >> /tmp/file
    • 语法正确吗?见下文。
    • 显然,您需要对要将输出重定向到的文件具有写访问权限。/tmp中当前不存在的唯一文件名应始终可写。
  3. 命令是否独立运行?
    • 通过在CLI上进行试运行,检查脚本是否有错误
    • 在测试您的命令时,以您正在编辑其crontab的用户身份进行测试,该用户可能不是您的登录名或根用户
  4. 克朗能管理你的工作吗?
    • 检查/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. 检查路径
    • 检查she-bangs/hashbangs行
    • 不要依赖于诸如PATH之类的环境变量,因为它们在cron下的值可能与在交互会话下的值不同
  7. 调试时不抑制输出
    • 常用的是这种抑制:30 1 * * * command > /dev/null 2>&1
    • 通过完全删除>/dev/null 2>&1来重新启用标准输出或标准错误消息输出;或者可能重定向到您具有写入权限的位置的文件:>>cron.out 2>&1将标准输出和标准错误附加到调用用户主目录中的cron.out

仍然不工作?哎呀!

  1. 提高cron调试级别
    • 德比安
      • /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
      • 重新运行cron
      • 打开/var/log/cron.log并查找详细的错误输出
    • 提醒:调试完成后,停用日志级别
  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

此语法仅对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命令

  1. crontab -l
    • 列出所有用户的cron任务。
  2. crontab -e,对于特定用户:crontab -e -u agentsmith
    • 启动crontab文件的编辑会话。
    • 退出编辑器时,将自动安装修改后的crontab。
  3. crontab -r
    • 从cron后台处理程序中删除crontab项,但不从crontab文件中删除。

我终于找到了解决办法。解决方法如下:

  1. 不要在要通过crontab执行的python脚本中使用相对路径。 我却做了这样的事:

    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
    
  2. 不要抑制crontab代码,而是使用mailserver检查用户的邮件。这给了我们更清晰的洞察力。

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/

相关问题 更多 >