CronTab没有运行

时间:2014-03-30 11:41:48

标签: linux ubuntu-12.04 crontab

我在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

14 个答案:

答案 0 :(得分:95)

<强> 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
    • Redhat:/var/log/cron
  5. 检查权限
    • 在命令上设置可执行标志:chmod +x /var/www/app/cron/do-stuff.php
    • 如果将命令输出重定向到文件,请确认您有权写入该文件/目录
  6. 检查路径
    • 检查she-bangs / hashbangs line
    • 不依赖于像PATH这样的环境变量,因为它们的值在cron下可能不会像在交互式会话中那样相同
  7. 调试时不要抑制输出
    • 常用的是这种抑制:30 1 * * * command > /dev/null 2>&1
    • 重新启用标准输出或标准错误消息输出
  8. 仍然无法正常工作?糟糕!

    1. 提高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
        • 重新加载记录器sudo /etc/init.d/rsyslog reload
        • 重新运行cron
        • 打开/var/log/cron.log并查找详细的错误输出
      • 提醒:完成调试后停用日志级别
    2. 再次运行cron并检查日志文件
    3. 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 :(得分:6)

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

  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
    
  2. 永远不要压缩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分:

  1. 放在/etc/cron.d/中的Cron配置文件不应包含点(。)。否则,它不会被cron读取。
  2. 如果运行命令的用户不在/ etc / shadow中。它不会被允许安排cron。
  3. <强>参考文献:

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

答案 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 脚本。

原始 bash 文件

#!/bin/bash

python /home/frosty/code/test_scripts/test.py

python 文件 (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,命令在该目录中。