我有一個預定的腳本,每小時對 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 將調用的簡短包裝腳本。