解決策 1:
ある種のロックを実装できます。これにより、まだ実行中の rsync プロセスの数が出力されます:
pgrep -cx rsync
これにより、他の rsync プロセスが存在しない場合にのみ rsync が実行されます:
pgrep -cx rsync || rsync ...
-x
の使用 不要な名前が誤って一致するのを防ぎます (たとえば、"foobarsync hronizator」または「not_an_rsync _totally" - pgrep -c ^rsync$
と同じように機能します )
解決策 2:
flock コマンドを使用すると、これを行うのに役立ちます。この場合 flock -n
ロックを取得できない場合、コマンドがすぐに失敗するため、おそらくこれが必要です。
30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript
解決策 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
解決策 4:
他のツールを検討する場合は、rdiff-backup も検討してください。 librsync を使用してバックアップを行い、構成可能な数のデルタ/インクリメントを保存します。また、一度に 1 つの rdiff-backup プロセスしか実行できないようにロックします。
解決策 5:
私の答えは、マイクが言ったことと多少同じです.
スクリプトには、次のように記述します:
- ロックファイルを作成する
- 次に実行するときに、ロック ファイルの存在を確認してください。
しかし、あなたがしなければならない非常に重要なことが1つあります。そしてそれはトラップシステムを実装することです.
それで、あなたができることは、何らかの理由でスクリプトが殺されたり、誰かがそれを殺したとしても、そのシグナルをトラップしてロックファイルを削除できるので、古いロックファイルがありません.
ここで実装方法を読むことができます。
ちょっとしたことですが、信号 9 をトラップすることはできません。つまり、誰かが kill -9
を実行した場合 、そのシグナルはカーネルと直接相互作用し、それをトラップする方法がないため、それをトラップすることはできません.
また、John が提案したように、古いファイルが残っていないことを確認するために、システムを再起動するたびにロック ファイルを削除する必要があります。
小さな rm -f <FILE>
を置くことで簡単にできること コマンド /etc/rc.local