[linux]crontab 命令執行問題


在服務器上設置了一個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  雖然我依然沒看懂,呵呵。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM