使用 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:感謝到目前為止的建議;我認為這更像是一個顛覆問題。我總是嘗試將我的環境封裝到我的腳本中,但這裡的問題是我不確定當我從cron.hourly。我猜這與 run-parts 腳本的執行方式有關。
您想使用“–config-dir”選項讓它知道在哪裡可以找到接受的證書(例如 ~/.subversion 預設情況下)。
也就是說,我幾乎可以肯定你最好從 hooks/post-commit 腳本中呼叫 svnsync,正如其他地方所建議的那樣。然後你的鏡像總是同步的,而不是與你的主人在一小時前的位置同步。
在 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 和我將使用的其他環境變數,所以我可以確定它在任何環境中都能正常工作。