rsyncを使用して、あるサーバーから別のサーバーにデータをバックアップしています。すべて正常に動作しますが、転送するデータの量によっては、完了するまでに時間がかかる場合があります。
前のコマンドがcronjobの使用を終了する前にrsyncコマンドが開始しないことを保証する保証された方法はありますか?
たとえば、rsyncコマンドを1時間ごとに実行していますが、転送が完了するまでに1時間以上かかる可能性があるため、次のコマンドは前のコマンドが終了する前に開始されます。
rsyncを使用して、あるサーバーから別のサーバーにデータをバックアップしています。すべて正常に動作しますが、転送するデータの量によっては、完了するまでに時間がかかる場合があります。
前のコマンドがcronjobの使用を終了する前にrsyncコマンドが開始しないことを保証する保証された方法はありますか?
たとえば、rsyncコマンドを1時間ごとに実行していますが、転送が完了するまでに1時間以上かかる可能性があるため、次のコマンドは前のコマンドが終了する前に開始されます。
回答:
何らかのロックを実装できます。これにより、まだ実行中のrsyncプロセスの数が出力されます。
pgrep -cx rsync
そして、これは他のrsyncプロセスが存在しない場合にのみrsyncを実行します:
pgrep -cx rsync || rsync ...
使用すると、-x
誤って不要な名前が一致するから防ぐことができます(例えば、「fooba rsyncを hronizator」または「not_an_ rsyncの _totally」 -それはちょうどように動作しますpgrep -c ^rsync$
)
たとえば、flockコマンドを使用して、これを行うflock -n
ことができます。たとえば、ロックを取得できない場合、コマンドがすぐに失敗するため、この場合はおそらく必要です。
30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript
/var/run
代わりにロックファイルを置くことにより、懸念を緩和し、もう少し「正しい」ことができます。
他のツールを検討したい場合は、rdiff-backupもご覧ください。librsyncを使用してバックアップを実行し、構成可能な数のデルタ/増分を保存します。また、ロックされるため、常に1つのrdiff-backupプロセスのみを実行できます。
これが私がすることです。ロックファイルを作成するには、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
私の答えは、マイクが言ったことと同じです。
スクリプトでは、次のようなものを配置する必要があります。
ただし、実行する必要がある非常に重要なことが1つあります。そして、トラップシステムを実装すること。
だから、それで、あなたができることは、あなたのスクリプトが何らかの理由で殺されたり、誰かがそれを殺したとしても、そのシグナルをトラップしてロックファイルを削除することができるので、古いロックファイルがありません。
ちょっとしたことですが、シグナル9をトラップすることはできません。誰かがそうするならkill -9
、そのシグナルはカーネルと直接対話するため、トラップすることはできません。トラップする方法はありません。
また、Johnが提案したように、古いファイルが残っていないことを確認するために、システムをリブートするたびにロックファイルを削除する必要があります。
rm -f <FILE>
/etc/rc.localに小さなコマンドを置くことで簡単にできること
-s(シリアル化)スイッチでanacron(アナクロニスティックcron)を見てください。Serializeは、前のコマンドがまだ実行中の場合にコマンドが再度呼び出されないようにします。
hatools(http://www.fatalmind.com/software/hatools/)を使用して、rsync cronを待機モードにロックします。
flock(1)