2014-03-30 77 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權限給予