2011-02-03 75 views
23

我已經在運行Java可執行文件的Linux服務器上添加了crontab項。 Java代碼使用它自己的類將錯誤和消息記錄到日誌文件中。調試crontab作業

但是當我在預定時間後檢查日誌文件時,沒有消息被記錄。應該至少有一條日誌消息說明執行已經開始。

因此,有兩個可能的原因:

  1. 代碼執行,但沒有記錄;
  2. 或者,代碼根本沒有執行。

指定的日誌文件具有chmod 777權限,所以我猜這是第二個原因。

爲什麼crontab作業不能在預定的時間執行?我如何在沒有發生任何記錄的情況下進行調試?

我讀過,如果有錯誤cron發送電子郵件給用戶。如何找出哪個電子郵件地址與用戶關聯?

回答

23

將2> & 1追加到您的Crontab命令的末尾。這會將stderr輸出重定向到stdout。然後確保你正在記錄crontab的Unix命令。

0 0,12 1 */2 * /sbin/ping -c 192.168.0.1; ls -la >>/var/log/cronrun 2>&1 

這將捕獲任何來自Unix命令。

一些額外的提示(前一天幫助一個同事......)。通過發出沒有參數的命令集來寫出環境變量。然後讓shell使用set -x命令來回顯每個命令。在腳本問題的頂部;

set 
set -x 
+0

仍犯規記錄任何東西。 crontab命令是`25 08 * * * /root/java/MyProject/sync.sh >> /root/java/Migration/sync.log 2>&1`。但是,如果我執行shell腳本,那麼代碼將運行,並且java記錄器類將寫入日誌文件 – naiquevin 2011-02-03 08:24:28

0

檢查您是否確實格式化了運行良好的時間。

例如,而不是

*/1 * * * * echo 'debug' > /home/glab/change_branch.log 

可能是這樣的:

1 * * * * echo 'debug' > /home/glab/change_branch.log 

,你可能期待它爲每分鐘運行。並且也沒有生成日誌。

0

可能導致你的問題的一件事是,cron(至少在我使用的分佈,亞馬遜Linux操作系統)認爲時間是UTC,因此如果你在不同的時區(例如-03:00 )你可能會預計它會提前3個小時運行,它實際上會和你沒有任何問題。

23

您可以爲cron作業啓用日誌記錄以追蹤問題。你需要編輯/etc/rsyslog.conf or /etc/rsyslog.d/50-default.conf(在Ubuntu)文件,並確保你有下面這行註釋掉或添加,如果缺少它:

cron.*       /var/log/cron.log 

然後重新啓動rsyslogcron

sudo service rsyslog restart 
sudo service cron restart 

Cron作業將登錄到/var/log/cron.log

0

假設手動運行該命令,但不在Cron中,可能正確的路徑不會暴露給cron命令。您可以通過運行crontab -e命令,然後直接輸入路徑進入的cron標籤解決這個問題:

# Export the path so that the scripts run correctly PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin