私はシステムの一般ユーザーが一度に1つのスクリプトしか実行できないようにしたいと思います。複数のユーザーがログインでき、各ユーザーは他のユーザーが実行したコマンドが完了した後にのみコマンドを実行できます。
ずっと前、私はUNIXでbatch
スクリプトの実行をシリアライズするために正しい「単一ジョブのみ」のキュー定義でコマンドを使用しました。これは多くのロック管理の問題を解決します(スクリプトで簡単なタイムアウトを設定するだけです)。
Linuxでは、batch
コマンドが異なるように実行され、1分ごとに1つのジョブが実行され、ロード平均1.5に達するまでジョブは並列に実行されます。
実行をシリアル化するために独自のロック管理シェルライブラリを作成しましたが、これを実行する標準コマンドがあるかどうか疑問に思いました。
ベストアンサー1
flock
本当に素晴らしいです。シェルスクリプトの周囲のラッパーで使用したりflock
、コマンドラインで使用したり、スクリプト自体に統合したりできます。
最善の点flock
は、待つときに忙しいループで待たないことです。
それもいつもプロセスの終了/終了時にロックを解除しますflock
。
プロセスがクリーンアップされずに終了する場合(またはカーネルパニックまたは停電がある場合...)、アトミックファイル/ディレクトリの作成に基づく方法がロックされることがあります。
flock
Linuxカーネルはそれを使用してクリーンアップを実行します。
マニュアルでは、
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
この形式では、特定のコードブロックをシェルスクリプトでラップします。
あるいは、これを実行することもできます。
/usr/bin/flock /tmp/lockfile command
無期限のブロック/待機を望まない場合は、タイムアウトを指定できます。
-w --timeout <secs> wait for a limited amount of time
または、単に非ブロックパラメータを使用してください。
-n --nonblock fail rather than wait