2009-08-12 78 views
9

這一直在我身上發生: 1)我寫了一個腳本(ruby,shell等)。 2)運行它,它的工作原理。 3)把它放在crontab中,這樣它會在幾分鐘內運行,所以我知道它從那裏運行。 4)它沒有,沒有錯誤跟蹤,回到步驟2或3 a 1000次。如何在crontab中測試東西

當我Ruby腳本在crontab中失敗了,我不知道爲什麼它沒有因爲當我管輸出是這樣的:

ruby script.rb >& /path/to/output 

我八九不離十拿到劇本的輸出,但我不從它得到的任何錯誤,我沒有得到錯誤來自bash(如果沒有發現紅寶石或文件不存在)

我不知道什麼環境變量設置,是否它是一個問題。原來,要從crontab運行ruby腳本,你必須導出大量的環境變量。

有沒有辦法讓我只用crontab運行一個腳本就好像我從我的終端自己運行它?

調試時,我必須重置計時器並返回到等待狀態。非常耗時。

如何更好地測試crontab中的內容或避免這些問題?

+0

哪裏是紅寶石?它是否在像/ usr/bin這樣的系統路徑中?看看:http://ubuntuforums.org/showthread.php?t=190671,看看是否有類似的消息,你看到的。 這是一個紅寶石在cron會看到的路徑之外的情況。 – maxwellb 2009-08-12 12:51:18

+0

我的crontab中的作業錯誤(實際上是任何輸出)通過電子郵件發送給我,crontab的所有者。不記得我需要更改任何設置以發生這種情況......您是否檢查過您的cronjob運行在系統上的任何電子郵件? – 2009-08-12 12:51:51

+0

如何將輸出指向syslog? http://angryruby.blogspot.com/2007/08/ruby-and-syslog.html – shuckster 2009-08-12 15:30:24

回答

1

你可以寫一個包裝腳本,打了個比方rbcron,它看起來像:

#!/bin/bash 
RUBY=ruby 
export VAR1=foo 
export VAR2=bar 
export VAR3=baz 

$RUBY "$*" 2>&1 

這將從紅寶石標準錯誤重定向到標準輸出。然後在你的cron作業中運行rbcron,標準輸出包含ruby的+ err,還包含rbcron自身存在的「bash」錯誤。在您的cron條目中,重定向2>&1 > /path/to/output以獲取輸出+錯誤消息以進入/ path/to/output。

+0

更改VAR1等,併爲你需要的任何值導出爲紅寶石。我沒有這些答案。 – maxwellb 2009-08-12 12:45:02

1

如果你真的想運行它爲自己,你可能希望從你的源.profile/.bashrc等。這樣,它會在你的環境中拉一個shell腳本調用紅寶石。

但是,缺點是它不是與環境隔離的,如果改變了這一點,您可能會發現您的cron作業突然停止工作。

+0

採購.profile/.bashrc將設置相同的環境變量設置從那個文件設置,但將在運行的過程中,不是「無法與環境隔離」,但是你是對的 - 它會在你的HOME目錄中創建一個文件的依賴關係 – maxwellb 2009-08-12 12:48:08

3

從ruby腳本內部運行'set'命令,從crontab中啓動它,你將看到到底是什麼設置,什麼不是。

7

「有沒有辦法讓我只用crontab運行腳本,就好像我自己從終端上運行它一樣?「

是:

bash -li -c /path/to/script 

從手冊頁:

[vindaloo:pgl]:~/p/test $ man bash | grep -A2 -m1 -- -i 
    -i  If the -i option is present, the shell is interactive. 
    -l  Make bash act as if it had been invoked as a login shell (see 
      INVOCATION below). 
+0

好的答案,這是從crontab執行某些事情的合適方式需要一個與從命令行執行相同的環境。 – 2010-06-18 04:10:04

2

要找出其中的cron運行作業環境,添加此cron作業:

{ echo "\nenv\n" && env|sort ; echo "\nset\n" && set; } | /usr/bin/mailx -s 'my env' [email protected] 

或將輸出發送到文件而不是電子郵件。

6

天兒真好,

一個與cron中的基本問題是,你得到一個最小環境中由cron設置。事實上,你只能得到四個環境。 VAR的設置,它們分別是:

  • SHELL - 在/ etc/passwd文件
  • 首頁發現設爲您的用戶ID - - 設置爲你的主目錄設置爲/ bin/sh的
  • LOGNAME。如發現在/ etc/passwd文件
  • PATH - 設置爲 「在/ usr/bin中:/ bin中」

就是這樣。

但是,您可以做的是拍攝所需環境的快照並將其保存到文件中。

現在讓你的cronjob源碼獲得一個簡單的shell腳本,它可以提供這個env。文件,然後執行你的Ruby腳本。

順便說一句,包裝源是一個普通的env。文件是爲多個cronjob實施一致環境的絕佳方式。這也強制DRY原則,因爲它只給你一個點來根據需要更新東西,而不必搜索一堆腳本並搜索特定的字符串,例如,如果記錄位置已更改或現在有不同的實用程序正在使用,例如gnutar而不是香草焦油。

實際上,這項技術非常成功地與The Build Monkey一起使用,該軟件用於實現持續集成,以實現幾家主要世界航空公司所共有的主要軟件項目的持續集成。 3,500kSLOC每天檢查並建立數次,每天進行8000次迴歸測試。

HTH

「Avahappy,