Rsync

防止備份並行執行

  • February 23, 2022

/usr/local/bin/backup在我每小時呼叫一次的腳本中/etc/crontab,我使用rsync將數據複製到異地伺服器。這一切都很好,即使在我們擁有的新數據多於一個小時內可以推出的情況下也是如此。

上周有人在數據分區上複製了一個 11GB 的文件,當我發現第二天有 14 個 rsync 程序並行執行時,每個程序都沒有頻寬,每個程序都可能在同一個大文件上工作。我把它們都殺了(在意識到我應該讓第一個執行之前),停止 cron 作業並手動執行備份腳本。

我可以在啟動 rsync 之前在腳本中寫出一個文件,並檢查該文件是否已經存在,以防止備份並行執行。有沒有更簡單的方法來做到這一點?

我的/etc/crontab條目:

5  *  *  *  *   root  /usr/local/bin/backup

有不同的方法可以做到這一點,但 IMO 最簡單的方法是在 crontab 文件中的命令之前插入羊群:

5  *  *  *  *   root  flock -n /var/lock/backup /usr/local/bin/backup

/var/lock/backup文件是flock 使用的鎖,-n如果鎖已經存在,則立即使命令失敗。

這當然可能意味著如果一個備份需要 1 小時 1 分鐘,那麼下一個備份將在 59 分鐘後開始。如果這是一個問題,您可以考慮使用-x.

在最近的 OpenBSD 安裝中(OpenBSD 6.7,自 2020 年 4 月 16 日快照以來),您可以-s在計劃本身中使用可選選項來避免重疊作業實例:

5 * * * * root -s /usr/local/bin/backup

或者,在 root 使用者自己的 crontab 中,

5 * * * * -s /usr/local/bin/backup

OpenBSDcrontab(5)手冊

命令可以修改如下:

$$ … $$ -s command 只有一個實例command會同時執行。command在前一個完成之前,不會安排其他實例。

引用自:https://unix.stackexchange.com/questions/270769