使用 crontab 和 /etc/cron.hourly,daily,weekly 的區別

使用 crontab 和 /etc/cron.hourly,daily,weekly 的區別

我有一個預定的腳本,每小時對 Subversion 儲存庫進行一次 svnsync 備份。我從根crontab 中的一個條目運行它,沒有出現任何問題,但我決定從/etc/cron.hourly 運行它,而不是為了獲得額外的可見性(並且因為我們的一位工程師不小心刪除了crontab ,因為他認為「crontab -r」的意思是「讀 crontab ;-))

cron.hourly 腳本中的 svnsync 命令全部失敗,並顯示一條訊息,指出需要接受 SVN 存儲庫的 SSL 證書(這是用戶第一次訪問 SVN 存儲庫時以交互方式收到的消息,但是一旦證書我已接受該訊息不會再次出現)。

因此,在我看來,從 cron.hourly 運行時與透過根 crontab 運行時腳本是在不同的使用者環境下執行的。誰能解釋其中的差異嗎?

更新:我應該要提到我的發行版,我在 CentOS 5.1 上使用 anacron。

更新2:感謝迄今為止的建議;我認為這更像是一個顛覆問題。我總是嘗試將我的環境封裝到我的腳本中,但這裡的問題是我不確定環境中(或缺少)什麼使 SVN 在我運行腳本時要求接受 SSL 證書cron.每小時。我猜這與運行部分腳本的執行方式有關。

答案1

您想要使用“--config-dir”選項讓它知道在哪裡可以找到接受的憑證(例如預設為〜/.subversion)。

也就是說,我幾乎可以肯定你最好從 hooks/post-commit 腳本中呼叫 svnsync ,因為在別處建議的。那麼你的鏡子總是同步的,而不是與你的主人一小時前的位置同步。

答案2

在 Debian/Ubuntu 系統上 cron.daily|weekly|montly 從主 crontab 啟動。

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

另請記住,您可能可以在 /etc/cron.d/ 中放置一個 crontab 片段

正如您所看到的,這個環境沒有什麼特別之處。至少在 Debian/Ubuntu 上,一切都是以 root 帳戶運行的。

當我在腳本的一開始編寫 cron 腳本時,我總是設定我將使用的 PATH 和其他環境變量,因此我可以確定它在任何環境中都能正常工作。

答案3

常規系統範圍的 crontab 是特定使用者的 crontab,它具有使用者名字段,如 所使用的/etc/crontab

使用腳本/etc/cron.*(每小時、每天、每週、每月)是為使用者配置 crontab 的一種更乾淨、更簡單的方法(防止常見的語法錯誤),root這是透過run-parts在目錄中執行腳本或程式來處理的。所有這些規則仍然預設在系統範圍的 crontab 中定義(/etc/crontab),所以它們是一樣的。

當 cron 作業由 處理時run-parts,更容易調試,因為您可以透過以下方式簡單地測試哪些腳本將準確運行(尚未運行它們):

sudo run-parts --report --test /etc/cron.daily

答案4

在我的 RHEL 5.1 系統上,PATH 環境變數是從 /etc/crontab 設定的。頂部的所有東西都是進入環境的東西。

如果您重新啟動 cron,那麼它第一次運行時(如果是從/etc/crontab/var/spool/cron/$USER)它會在 /var/log/cron 中記錄下來。否則它只會注意到 cron.hourly 運行了

我的 crontab 設定如下:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

你可以做的是將類似以下內容放入 /etc/cron.hourly 中:

env > /tmp/cron.env

然後在文件出現時檢查該文件,並修改您的腳本(如果可以的話)以正確設置環境,或者編寫 crontab 將調用的簡短包裝腳本。

相關內容