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

答え2

おそらくあなたが望むのは、ユーザーが実行できるプロセスの数に対する厳しい制限ですか?シェルプロセスやその他必要なものが含まれていることを確認してください。必要会議中に走ってください。

これは、/etc/security/limits.conf に次の行を追加することで設定できます。

testuser hard nproc 2

多くの項目を同時に実行しようとすると、フォークできないエラーが発生します。必要に応じて2を変更し、制限したいユーザーに「testuser」を変更します。

答え3

mkdirこれを原子プロセスとして使用して他のプロセスをロックします。その当時は一人だけがディレクトリを作ることができました。

#!/bin/bash
if ! mkdir /tmp/TheLock 2> /dev/null ; then
    echo Error, user \'$(stat -c %U /tmp/TheLock)\' has the task
else
    echo Yes, I got it\!
    sleep 1 # do stuff
    rmdir /tmp/TheLock
fi

もしあなたまずスクリプトを実行すると、次のように表示されます。

Yes, I got it!

誰かが同時に実行しようとすると、出力は次のようになります。

Error, user 'Emmanuel' has the task

関連情報