私はシステムの一般ユーザーが一度に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
答え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