ソケット・ソリューションは、まだそれはソケットが効果的なミューテックスとして使用することができることを指摘する価値がある言及されていなかったので。ソケットの作成は原子操作であり、mkdir
はGunstickが指摘しているように、ソケットはロックまたはmutexとして使用するのに適しています。
Tim KayのPerlスクリプト 'Solo'は、スクリプトのコピーを一度に1つしか実行できないようにするための非常に小さく効果的なスクリプトです。これはcronジョブ用に特別に設計されていますが、他のタスクでもうまく動作しますが、非crobジョブでも非常に効果的です。
Soloは、スクリプトの外部でチェックが実行されるという点で、これまで説明した他の手法よりも1つの利点があります。スクリプトがすでに実行されている場合、そのスクリプトの2番目のインスタンスは決して起動されません。これは、ロックで保護されているスクリプト内のコードブロックを分離するのとは対照的です。編集:flock
がスクリプト内からではなくcronジョブで使用されている場合は、それを使用してスクリプトの2番目のインスタンスが開始されないようにすることもできます。下記の例を参照してください。ここで
はあなたのcronでそれを使用する方法の例です:
*/5 * * * * solo -port=3801 /path/to/script.sh args args args
# "/path/to/script.sh args args args" is only called if no other instance of
# "/path/to/script.sh" is running, or more accurately if the socket on port 3801
# is not open. Distinct port numbers can be used for different programs so that
# if script_1.sh is running it does not prevent script_2.sh from starting, I've
# used the port range 3801 to 3810 without conflicts. For Linux non-root users
# the valid port range is 1024 to 65535 (0 to 1023 are reserved for root).
* * * * * solo -port=3802 /path/to/script_1.sh
* * * * * solo -port=3803 /path/to/script_2.sh
# Flock can also be used in cron jobs with a distinct lock path for different
# programs, in the example below script_3.sh will only be started if the one
# started a minute earlier has already finished.
* * * * * flock -n /tmp/path.to.lock -c /path/to/script_3.sh
リンク:
・ホープこれは役に立ちます。
可能重複[一度に1つのシェルスクリプトのインスタンスしか確実に実行されないようにするためのクイックアンドダーティな方法](http://stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only- shell-script-is-running-at) – user