在服務器上設置了一個R腳本的crontab任務,死活不執行。在網上搜了很久,終於解決了。
這里主要說一下crontab異常時,該如何排查。
假設cron命令為:* * * * Rscript /your_path/hello_world.r >> /your_path/hello_world.log
1.首先檢查cron命令是否完全正確。
雖然很簡單,但是我還是在這吃了不少苦。
具體症狀主要表現為cron不執行,並且crontab執行日志下找不到執行記錄。
contab的執行日志在/var/log/cron.log中(Ubunutu),vi之后使用nG跳到最后一行,可以看到最新的執行記錄。
如果沒有看到cron命令,則很可能是命令或者命令路徑不正確。仔細檢查一下。
注:No MTA installed, discarding output 這個信息,講道理與執行腳本與否無關。可以不必理會。
(crontab執行腳本時是不會直接錯誤的信息輸出,而是會以郵件的形式發送到你的郵箱里,這時候就需要郵件服務器了,如果你沒有安裝郵件服務器,它就會報這個錯)
2.crontab環境配置問題
如果手動在shell中可以執行,但是在crontab中無法執行時,就應該考慮這個問題了。
這個時候在cron日志中可以看到cron命令的執行記錄,但是腳本就是死活不執行。hello_world.log下什么信息都沒有。
搜到很多內容,說是環境配置的問題(確實也應該是環境配置的問題)。簡單的說就是crontab執行時的環境和我們自己在shell中執行時的環境是不一致的。
更詳細的內容可以參考這里:http://blog.csdn.net/zc02051126/article/details/20480289
雖然鏈接里說了很多解決方案,但是我並不知道他在說什么,呵呵。
我直接指定了命令的絕對路徑,將cron命令改為:* * * * /usr/local/bin/Rscript /your_path/hello_world.r >> /your_path/hello_world.log
再次編輯crontab,終於在hello_world.log中找到了輸出信息。
* 絕對路徑根據自己安裝程序位置的不同而不同。常見的有/usr/bin,/usr/local/bin等。如果不確定,就自己去路徑下ls看是否存在相應程序。
* 網上很多說在腳本中首行加上環境路徑(如#!/usr/bin/env Rscripit)。但是我沒成功,不知道為什么。
3.腳本路徑的問題
問題為手動運行腳本正常, 但是通過crontab自動運行則不成功。查看crontab的log發現在指定時間運行了任務,只是看不到結果。
剛開始以為是權限或者環境的問題,但細想又想不通。
事實上當crontab的log顯示cron任務執行,但沒有結果輸出的時候,應該開始懷疑本身腳本的問題了。
以我的例子來說,debug之后發現是腳本含文件路徑,並且使用的相對路徑。因為crontab環境和手動運行腳本時的環境不同,導致文件路徑無效,進而腳本無效,於是crontab沒有結果。將腳本中的相對路徑改成絕對路徑之后,crontab的結果就正常了。
Crontab命令指南,可以參考:http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html 雖然我依然沒看懂,呵呵。