バックアップが同時に実行されないようにする

バックアップが同時に実行されないようにする

/usr/local/bin/backup1時間ごとに呼び出されるスクリプトでは、/etc/crontab次のものを使用します。同期外部サーバーにデータをコピーします。これらすべては、1時間以内にプッシュできるよりも多くの新しいデータがある場合でもうまく機能します。

先週、誰かがデータパーティションに11 GBのファイルをコピーしました。各プログラムには帯域幅がなく、おそらく同じ大容量ファイルで作業しています。私はそれらをすべて殺し(最初のものを実行する必要があることに気づく前に)、cronジョブを停止し、バックアップスクリプトを手動で実行しました。

rsyncを起動する前に、スクリプトにファイルを作成し、ファイルがすでに存在することを確認して、バックアップが並行して実行されるのを防ぎます。より簡単な方法がありますか?

私の/etc/crontabアイテム:

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

答え1

方法はさまざまですが、最も簡単な方法は挿入することだと思います。グループcrontabファイルのコマンドの前に:

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

この/var/lock/backupファイルはクラスターによって使用されるロックで、-nロックがすでに存在する場合、コマンドはすぐに失敗します。

もちろん、これは1回のバックアップに1時間1分かかる場合、次のバックアップは59分後に開始されることを意味します。これが問題ならば-x

答え2

最近の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 一度に1つのインスタンスのみがcommand実行されます。command以前のインスタンスが完了するまで、他のインスタンスは予約されません。

関連情報