Linux

讓我的伺服器維護腳本正確

  • June 25, 2016

我有兩個例行的 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本問答中所述

引用自:https://serverfault.com/questions/786201