2009-04-23 147 views
5

我有一個Perl腳本(XMLTV「抓取器」家族的一部分,特別是tv_grab_oztivo)。爲什麼我的命令行不能從cron運行?

我可以成功地這樣運行:

/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

我使用的完整路徑的一切,以消除工作目錄的問題。權限不應該是一個問題。

所以,如果我從終端(Mac OSX)運行它,它工作得很好。

但是當我將它設置爲通過cron作業運行時,根本沒有任何事情發生。沒有輸出創建等

據我所知,沒有任何錯誤的crontab,因爲如果我用實際腳本替換helloworld.pl,它在正確的時間運行得很好。

那麼,我能做些什麼來調試?在這兩種情況下,我可以看到%ENV這個環境非常不同,但是我還可以採取其他哪些方法進行調試?我怎樣才能看到cron作業的輸出,這可能是某種perl「死」消息或shell中的「未找到」消息或其他東西?

或者我應該試圖以某種方式讓命令的cron版本與它運行時的環境相同?

回答

8

這是經常因爲在cron下運行時沒有獲得完整的環境。最好的辦法是使用命令捕獲輸出中:

(/sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 

,然後看看/tmp/qq

如果它變成是一個缺少的環境,那麼你可能需要把:

. ~/.profile 

或類似的東西,到你的cron作業的執行鏈,如:

(. ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 
-1

cron通常捕獲stdout和stderr的輸出並將任何輸出發送到crontab所有者。

您是否仔細檢查了您的crontab條目以確保它是有效的並且將在正確的時間執行?

確保該腳本不需要任何環境變量集。否則,將其包裝在另一個(bash)腳本中,您可以在其中設置其他腳本所期望的環境變量。

+0

「您是否仔細檢查了您的crontab條目以確保它是有效的,並且會在正確的時間執行?」 - 是的。我是這麼說的。 – AmbroseChapel 2009-04-23 02:56:26

+0

沒關係,我只是想仔細檢查一下。 crontab的語法很棘手,很容易弄錯。 – lothar 2009-04-23 03:11:25

+0

如果您沒有收到郵寄給您的cron輸出,您可以使用crontab頂部的MAILTO = [email protected]來更改輸出的內容。只要確保您的本地郵件工程。 – preaction 2014-05-14 06:15:39

3

如果您在查看兩種情況下的%ENV,我建議您作爲perl腳本的第一步,將%ENV設置爲cron作業中的內容,然後嘗試從命令行。您可能需要一次exec的自己,這纔會完全控制:

BEGIN { 
    if (exists $ENV{something_in_your_env_not_in_cron}) { 
    %ENV = (...); 
    exec $^X, $0, @ARGV; 
    } 
} 

現在試着運行它,並查看是否有什麼可以做,以對其進行調試(包括如果需要的perl下運行-d)。很可能,您會發現最終一次將項目添加回%ENV,直到它奇蹟般地開始工作(LD_LIBRARY_PATH對此很好,但對於Oracle或DB2應用程序,ORACLE_HOME或DB2HOME也可能是不錯的選擇)。然後,您可以在腳本中或在crontab中設置變量。

0

我會通過cron命令的絕對路徑運行一個簡單的shell腳本。 在該腳本中,我確保將stdout和stderr捕獲到已知(或可知)文件中。我也會確保你的環境已經足夠。在Unix上,當你通過cron運行一個命令時幾乎沒有環境設置 - 我不確定MacOS X.問題的標準問題是PATH。我有一個單獨的.cronfile,它使我的工作環境足以讓我通常沒有問題 - 這是.profile的模擬。

0

有時候,如果你不能弄清楚你的命令行出了什麼問題,最簡單的方法就是把整個事情變成一個shell腳本。理想情況下,你不應該這樣做,但它可以是解決問題的最快方法。

文件:/files/cron1.sh

#!/bin/sh 
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

然後在cron:

/files/cron1.sh 

這使您可以測試腳本獨立的cron。請記住,您的登錄shell使用不同於cron的環境變量運行。

相關問題