2014-03-30 145 views
17

我有root用户设置的cronjob在Ubuntu环境如下键入crontab -e命令的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使用

p纤ep的cron

运行检查,并给出进程ID 3033.The壳纸条是调用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 
+1

莫非是在.SH文件权限问题改变由 Crons取得根所有者权限和所有者?也许可以运行'chmod + x daily.sh' –

+3

请记住,cron作业不会与交互式命令所需的所有环境一起运行 - 例如,当您调用“python”时,这就是查找基于完整文件路径在环境变量$ PATH上。您应该完全指定路径以避免依赖性。 – IMSoP

+0

@ Jens-AndréKoch不,我也尝试过,但不起作用。 –

回答

68

WTF ?!我的cronjob不运行?!

这里有一个清单,指导调试没有运行cronjobs:

  1. 是cron守护程序运行?
    • 运行ps ax | grep cron并寻找cron。
    • Debian的:service cron startservice cron restart
  2. 是cron的工作?
    • * * * * * /bin/echo "cron works" >> /file
    • 语法正确吗?见下文。
  3. 命令是否独立工作?
    • 检查脚本有错误,通过测试你的命令时,测试作为其crontab中要编辑的用户,这可能不是你的账号或根
    在CLI
  4. 做一个预演
  5. cron可以运行你的工作吗?
    • 检查/var/log/cron.log/var/log/messages的错误。
    • Ubuntu的:grep CRON /var/log/syslog
    • 红帽:/var/log/cron
  6. 检查权限
    • 集可执行标志的命令:chmod +x /var/www/app/cron/do-stuff.php
    • ,如果你重定向你的命令到一个文件输出,验证你有权写入该文件/目录
  7. 条检查路径
    • 检查她刘海/ hashbangs线
    • 不依赖于像PATH环境变量,因为它们的价值将可能不会在cron下一样的交互式会话下
  8. 唐“T禁止输出,同时调试
    • 常用的是该抑制:30 1 * * * command > /dev/null 2>&1
    • 重新启用标准输出或标准错误消息输出

仍然无法正常使用?哎呀!

  1. 筹集/etc/default/cron
  2. cron的调试级别
    • Debian的
      • 设置EXTRA_OPTS="-L 2"
      • service cron restart
      • tail -f /var/log/syslog看到脚本执行
    • Ubuntu的 在/etc/rsyslog.d/50-default.conf
    • 添加或注释掉线cron.crit /var/log/cron.log
    • 重载记录仪sudo /etc/init.d/rsyslog reload
    • 重新运行的cron
    • 开放/var/log/cron.log,查找详细的错误输出
    • 提醒:禁用日志级别,当你与调试
  3. 运行的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 

crontab命令的

  1. crontab -l
    • 列出所有用户的cron任务。
  2. crontab -e,对于一个特定的用户:您的crontab文件的crontab -e -u agentsmith
    • 开始编辑会话。
    • 当您退出编辑器时,修改后的crontab会自动安装。
  3. crontab -r
    • 将删除的cron后台程序的crontab条目,而不是从crontab文件。
+1

这里应该包括一些额外的要点:1)测试你的命令时,测试你正在编辑crontab的用户,这可能不是你的登录名或根目录; 2)正如我上面提到的那样,最好不要依赖像'PATH'这样的环境变量,因为在cron下它们的值可能与交互式会话下的值不一样。 – IMSoP

+1

:)谢谢。发布更新。 –

+0

会尝试这个谢谢:-) –

5

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

  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的代码,而不是使用邮件服务器和检查邮件的用户。这更清楚地了解到底发生了什么。

+0

也永远不会忘记hashbangs#!/ usr/bin/env python顶部:-) –

+1

感谢您发布您的解决方案,因为它可以帮助我获得我的python脚本,也可以在cron中工作:) – JulianHarty

-1

有时,cron的需要运行的命令是在cron的也进不去,一般上,用户的主目录的权限是700和命令在该目录系统中的目录。

0

我发现另一个原因是用户的crontab没有运行:主机名不存在的hosts文件:

[email protected]:~$ cat /etc/hostname 
ubuntu 

现在hosts文件:

[email protected]:~$ 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,修复它的方法是将主机名添加到主机文件,因此它类似于这样的:

[email protected]:~$ 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

另一个原因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/

+0

这个修复了它。但严重的是,跆拳道的人!这个cron被认真设计来取笑人们。 – Utku

0

对我来说,解决方案是该文件的cron试图运行在一个加密的目录,更具体地说,用户指向/ home /。尽管crontab配置为root用户,因为在/ home/cron的加密用户目录中运行的脚本只能在用户实际登录时才能读取该目录。要查看目录是否加密,请检查此目录是否存在:

/home/.ecryptfs/<yourusername> 

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

对我来说,修复方法是将脚本移动到非加密目录,并且每个工作都正常。

0

我遇到了crons没有运行的同样的问题。 我们通过固定正如我们在crontab中曾提到和 Cronjobs 644权限给予