2016-10-31 10 views
1

私は複数のインスタンスが同時に実行されているbashスクリプトを作成しています。私はこれが起こらないようにしようとしています。だから私は、スクリプトのインスタンスが1つだけ実行されていることを確認するために、群れのメカニズムを使用しています。他のインスタンスは、そのターンを待つ。並行ジョブを順次処理する

exec 200<$LOCK 
flock -x 200 
echo "secured flock $1" 
sleep 10 
echo "exit $1" 

ただし、この方法では実行の順序での保証はありません。たとえば :

# ~/proj/scripts $ sudo ./parallel.sh 2 & 
[2] 10668         
# ~/proj/scripts $ sudo ./parallel.sh 3 & 
[3] 10674         
# ~/proj/scripts $ sudo ./parallel.sh 4 & 
[4] 10681        
# ~/proj/scripts $ sudo ./parallel.sh 5 & 
[5] 10687      
# ~/proj/scripts $ sudo ./parallel.sh 6 & 
[6] 10696 

secured flock 3 exit 3 
secured flock 6 exit 6 
secured flock 4 exit 4 
secured flock 2 exit 2 
secured flock 5 exit 5 

は私が呼び出し

上記の例の順序を保証すると同じ並行性の保護を達成するためにその可能かどうかを確認しようとしているだけの単純化しすぎです。

これらのプロセスは、通常、5秒ごとに定期的に開始されます。ただし、実行を完了するために時には5秒以上(たとえば10秒)以上かかることがあります。したがって、プロセス2がプロセス3よりも前に開始すると言うことは間違いありませんが、プロセス2が完了するまでに時間がかかる場合は、約5秒後にプロセス4-6が同じ順序で開始する保証はありません。

+0

を実行していますか? – Barmar

+0

解決策が可能かどうかわかりません。プロセス3がプロセス2よりも前に実行を開始したとします。プロセス2を開始することをどのように知っているので、できるだけ早くロックを取得すべきではありませんか? – Barmar

+0

ロックが要求された順に付与されるロック機構が必要なようです。 – Barmar

答えて

0

あなたは並行して提出できるキューデーモンを持っていて、次にシリアルでジョブを実行しますか? https://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-queue-system-batch-manager

true >jobqueue; tail -n+0 -f jobqueue | parallel -j1 

から

は、その後、5秒ごとのようにジョブを送信することができます:あなたは順次実行したい場合は、なぜあなたは最初の場所でそれらを同時に

echo my_command my_arg >> jobqueue 
関連する問題