前のrsyncジョブが終了するまでcronjobを待機させます


11

rsyncを使用して、あるサーバーから別のサーバーにデータをバックアップしています。すべて正常に動作しますが、転送するデータの量によっては、完了するまでに時間がかかる場合があります。

前のコマンドがcronjobの使用を終了する前にrsyncコマンドが開始しないことを保証する保証された方法はありますか?

たとえば、rsyncコマンドを1時間ごとに実行していますが、転送が完了するまでに1時間以上かかる可能性があるため、次のコマンドは前のコマンドが終了する前に開始されます。


ジョブの完了に1時間以上かかる可能性があり、その期間よりも近い時間にスケジュールしている場合、ジョブのスケジュールを誤っています。時間を短縮する方法を見つけるか、ジョブ間の間隔を長くします。リモートバックアップを継続的に行う場合は、新しい災害復旧計画を検討することをお勧めします。
vgoff

回答:


10

何らかのロックを実装できます。これにより、まだ実行中のrsyncプロセスの数が出力されます。

pgrep -cx rsync

そして、これは他のrsyncプロセスが存在しない場合にのみrsyncを実行します:

pgrep -cx rsync || rsync ...

使用すると、-x誤って不要な名前が一致するから防ぐことができます(例えば、「fooba rsyncを hronizator」または「not_an_ rsyncの _totally」 -それはちょうどように動作しますpgrep -c ^rsync$


明らかでない場合。-cは、rsyncという名前のプロセスの数をカウントします。これが0でない場合、シェルは結果をtrue(falseではない)として解釈します。|| 「または行」では、最初の項目がtrueであり、2番目の項目であるrsyncを実行する必要がないことを確認します。
ロブ・

12

たとえば、flockコマンドを使用して、これを行うflock -nことができます。たとえば、ロックを取得できない場合、コマンドがすぐに失敗するため、この場合はおそらく必要です。

30 * * * *  /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 

一般に、/ tmpの予測可能なファイル名は、競合状態と/ tmpディレクトリへの広範なアクセスのために、多くの場合危険です。この場合、安全ですか?
mc0e

この場合、予測可能な名前は安全であるだけでなく、必要です。それがロック(名詞)をロック(動詞)にするものです。言い換えれば、ロックの状態は、具体的かつ予測可能な名前のファイルの存在のみに基づいています。ファイル名が予測不能であった場合、またはファイル名が動的に変更された場合、flockはrsyncをそれ自体で実行することを許可し、目的を無効にします。ただし、/var/run代わりにロックファイルを置くことにより、懸念を緩和し、もう少し「正しい」ことができます。
エヴァンデラクルス

3

他のツールを検討したい場合は、rdiff-backupご覧ください。librsyncを使用してバックアップを実行し、構成可能な数のデルタ/増分を保存します。また、ロックされるため、常に1つのrdiff-backupプロセスのみを実行できます。


rdiff-backupも使用します。ただし、rdiff-backupはrsync単独よりも完了に時間がかかるため、このセットアップでは注意が必要です。
mgabriel

3

これが私がすることです。ロックファイルを作成するには、rsyncを囲むラッパースクリプトを作成します。

script 1
- create lock file
- rsync
- remove lock file

script 2 (running later then script 1)
- check if lock file is there
    - if not run
    - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script

2
再起動後にロックファイルも必ず削除してください。そうしないと、再度実行されないプロセスが発生する可能性があります。
ジョンガーデニアス

2

私の答えは、マイクが言ったことと同じです。

スクリプトでは、次のようなものを配置する必要があります。

  • ロックファイルを作成する
  • 次回実行するときにロックファイルの存在を確認します。

ただし、実行する必要がある非常に重要なことが1つあります。そして、トラップシステムを実装すること。

だから、それで、あなたができることは、あなたのスクリプトが何らかの理由で殺されたり、誰かがそれを殺したとしても、そのシグナルをトラップしてロックファイルを削除することができるので、古いロックファイルがありません。

ここでそれを実装する方法を読むことができます

ちょっとしたことですが、シグナル9をトラップすることはできません。誰かがそうするならkill -9、そのシグナルはカーネルと直接対話するため、トラップすることはできません。トラップする方法はありません。

また、Johnが提案したように、古いファイルが残っていないことを確認するために、システムをリブートするたびにロックファイルを削除する必要があります。

rm -f <FILE>/etc/rc.localに小さなコマンドを置くことで簡単にできること


1

-s(シリアル化)スイッチでanacron(アナクロニスティックcron)を見てください。Serializeは、前のコマンドがまだ実行中の場合にコマンドが再度呼び出されないようにします。


あなたは質問を誤解しているかもしれません。
ジョン・ガーデニアス

そうは思いません。質問は、「前のコマンドがcronjobの使用を終了する前にrsyncコマンドが開始しないようにする保証された方法はありますか?」です。Anacronは、追加/異なる機能でcronjobsを実行します。Serializeは、呼び出すコマンドが前のコマンドが終了するまで開始しないことを保証します。
tu-Reinstate Monica-dor duh

謝罪いたします。質問を読み違えたのはでし
ジョンガーデニアーズ


0

OSXバージョンのpgrepには-cオプションがないように思われるため、mgabrielのソリューションをOSXで動作させることはできませんでした(これは重要だと思います)。代わりに、次を使用しました。

[ $(pgrep ping | wc -l) -eq 0 ] && ping multiplay.co.uk || echo "Sorry, ping already in progress"

コマンドの例としてpingを使用しました。

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.