Linuxでコマンド実行をシリアル化する方法は?

Linuxでコマンド実行をシリアル化する方法は?

私はシステムの一般ユーザーが一度に1つのスクリプトしか実行できないようにしたいと思います。複数のユーザーがログインでき、各ユーザーは他のユーザーが実行したコマンドが完了した後にのみコマンドを実行できます。

ずっと前、私はUNIXでbatchスクリプトの実行をシリアライズするために正しい「単一ジョブのみ」のキュー定義でコマンドを使用しました。これは多くのロック管理の問題を解決します(スクリプトで簡単なタイムアウトを設定するだけです)。

Linuxでは、batchコマンドが異なるように実行され、1分ごとに1つのジョブが実行され、ロード平均1.5に達するまでジョブは並列に実行されます。

実行をシリアル化するために独自のロック管理シェルライブラリを作成しましたが、これを実行する標準コマンドがあるかどうか疑問に思いました。

ベストアンサー1

flock本当に素晴らしいです。シェルスクリプトの周囲のラッパーで使用したりflock、コマンドラインで使用したり、スクリプト自体に統合したりできます。

最善の点flockは、待つときに忙しいループで待たないことです。

それもいつもプロセスの終了/終了時にロックを解除しますflock

プロセスがクリーンアップされずに終了する場合(またはカーネルパニックまたは停電がある場合...)、アトミックファイル/ディレクトリの作成に基づく方法がロックされることがあります。

flockLinuxカーネルはそれを使用してクリーンアップを実行します。

マニュアルでは、

(
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

おすすめ記事