
我有一個運行 rsync 命令的 cron 作業,該命令每兩個小時進行一次遠端備份。
如果先前的遠端備份仍在運行,我已將這個 rysnc 命令封裝在叢集命令中。
Flock 防止此指令同時執行多次:
flock -n /location/of/lock_file -c 'rsync -rv /home/localuser/ [email protected]:/home/remoteuser/backupFolder' || echo "Couldn't perform remote backup, because previous remote backup is still in progress."
但是,如果我在其中一個備份期間重新啟動遠端伺服器(以模擬連接中斷的情況),flock 會繼續阻止未來的嘗試,因為先前的進程(儘管與備份目標永久斷開連接)仍然存在。
讓flock知道rsync無限期失敗並因此釋放這些阻止未來嘗試開始的鎖的最佳方法是什麼?
在 rsync 手冊頁上,我看到有一個 --timeout 參數。這樣設定是處理羊群全天候鎖定的最佳方法嗎?
答案1
這並不能回答您的問題,flock
但無論如何可能會有所幫助。不久前有一個關於備份策略的類似問題,我喜歡我的答案足以自己實現它。
基本概念是讓備份腳本完成後在備份目標上建立一個文件,並在開始運行後立即刪除該文件。然後,您讓腳本測試該文件是否存在,並且僅在該文件存在時才允許它運行:
#!/usr/bin/env bash
## Make sure no backup is currently running
if [ ! -e /path/to/backup/backup_finished.txt ]; then
echo "A backup seems to be running, or did not finish correctly, exiting." &&
exit;
fi
## Delete the file from the remote server
ssh user@remote rm /path/to/backup/backup_finished.txt
## Do da rsync
rsync /path/to/source/ user@remote:/path/to/daily/backup/
## Create the file on the remote server
ssh user@remote touch /path/to/backup/backup_finished.txt
這是一種比您的方法簡單得多的方法,但它的優點是我可以捕獲(儘管不能以任何優雅的方式處理)未完成的備份。您可以擴展它來測試備份是否正在實際運行,或者舊備份是否沒有完全退出並做出相應的反應。
由於您需要監視本機和遠端電腦上的進程,因此我認為鎖定檔案系統不起作用。