Linux
讓我的伺服器維護腳本正確
我有兩個例行的 postgresql 維護任務,需要從我的 Web 應用程序的某些表中刪除老化的行。
兩者分別需要約 1 小時才能完成。
目前,這些維護任務中的每一個都由一個腳本表示,該腳本在一天中的指定時間通過 crontab 呼叫。我嘗試安排兩個腳本之間至少有約 2 小時的間隔,因為我不希望這兩個任務之間有任何重疊。
我的問題是 - 我可以將兩個腳本合併為一個,如下所示:
#!/bin/sh dbname="dbname" username="myuser" psql -d $dbname -U $username << EOF # task 1 delete from links_publicreply WHERE "submitted_on" < now() - interval '14 days' AND id NOT IN (SELECT latest_reply_id FROM links_link WHERE la$ # task 2 begin; DELETE FROM links_vote WHERE link_id IN (SELECT id FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted$ DELETE FROM links_photoobjectsubscription WHERE which_link_id IN (SELECT id FROM links_link WHERE id NOT IN (select answer_to_id from links_pu$ DELETE FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted_on" < now() - interval '1 hour'; commit; EOF
注意刪除任務是如何一個接一個地呼叫的。*這樣,我可以確定任務 2 僅在任務 1 完成後才開始。*我想確認我的理解是正確的,或者是否有任何需要牢記的警告。請指教。
也許您的 crontab 文件現在看起來像:
# My cronjobs: * 2 * * * /scripts/task1.sh * 4 * * * /scripts/task2.sh
您有多種選擇,而不是希望將兩個 cron 作業安排得足夠遠,以至於當一個作業的執行時間比預期的長一點時它們不會重疊:
1. 只需安排一個按順序執行多個腳本的 cron 作業:
# My cronjobs: * 2 * * * /scripts/nightly-tasks.sh
一個簡單的腳本(可以通過更多的錯誤處理等大大改進)已經保留了序列並防止第二個腳本在第一個腳本尚未(尚未)成功完成時啟動:
#!/bin/bash # /scripts/nightly-tasks.sh /scripts/task1.sh && /scripts/task2.sh
2. 將腳本合併 到一個腳本中是完全有效的,但取決於那些現有腳本的複雜性,並不總是最好的解決方案。
在您的範例中,它應該可以工作,儘管您可能希望考慮移動
begin
語句以使其成為單個事務。3. 使用鎖定文件來防止一個 cron 作業在另一個完成之前啟動,
flock
如本問答中所述