2016-05-13 8 views
2

私はプロセス間で同期したいと思います。私のコンピュータは2つのコアを持っています。コマンドラインからシミュレーション番号を入力することができます。入力が2、プロセスの1つが終了するまで待機する必要があります。そのうちの1つが終了した場合、次のプロセスが実行されます。たとえば、最初の2つのプロセスはすでに進行中であり、1番目のプロセスは2番目のプロセスの前に終了しています。実行されます。私はbashで新しいです、私は考え出しました。それは待っている:コマンドが見つかりませんでした。私はどのようにそれを行うことができますか?ここに私のスクリプトは次のとおりです。一つのプロセスが終了して別のプロセスを実行するのを待ちます。

#!/bin/bash 
# My first script 

count=2 
echo -n "Please enter the number of simulation :" 
read number 
echo "Please enter the algorithm type " 
printf "0 for NNA\n1 for SPA\n2 for EEEA :" 

while read type; do 
    case $type in 
     0) cd /home/cea/Desktop/simulation/wsnfuture 
     taskset -c 0 ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/NNA/NNA0/0 & 
     taskset -c 1 ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/NNA/NNA0/1 & 
     while [ $count -lt $number ]; do 
     anywait 
      cd /home/cea/Desktop/simulation/wsnfuture 
     mkdir /home/cea/Desktop/simulation/RESULTS/NNA/NNA$count 
     taskset -c $((count % 2)) ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/NNA/NNA$count/$count & 
      count=$((count + 1)) 
     done 
     ;; 
     1) while [ $count -lt $number ]; do 
      cd /home/cea/Desktop/simulation/wsnfuture1 
     taskset -c $((count % 2)) ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/SPA/$count & 
      count=$((count + 1)) 
     done 
     ;; 
     2) while [ $count -lt $number ]; do 
      cd /home/cea/Desktop/simulation/wsnfuture2 
     taskset -c $((count % 2)) ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/EEEA/$count & 
      count=$((count + 1)) 
     done 
     ;; 
     *) echo "You did not enter a number" 
     echo "between 0 and 2." 
     echo "Please enter the algorithm type " 
     printf "0 for NNA\n1 for SPA\n2 for EEEA :" 

    esac 

done 

function anywait(){ 
while ps axg | grep -v grep | grep wsnfuture> /dev/null; do sleep 1; done 
} 
+0

私の答えのように 'wait'コマンドを使って問題を解決できましたか? – Inian

+0

ユーザー応答にselect文を使用して、待機を待つことができます。まだpsが必要な場合は、pgrepが優れています。 – SaintHax

答えて

6

あなたは次を実行する前に完了するためにバックグラウンドジョブの1つの以上の数を待っwaitを使用してbashにプロセス同期の簡単な方法を達成することができます。

通常、コマンドの末尾に&演算子を追加して、バックグラウンドでジョブを実行します。この時点で、新しく作成されたバックグラウンドプロセスのPID(プロセスID)は、特別なbash変数に格納されます。$!およびwaitコマンドを使用すると、次の命令を実行する前にこのプロセスを終了できます。

これは単純な例で実証することができる

$ cat mywaitscript.sh 

#!/bin/bash 

sleep 3 & 

wait $!  # Can also be stored in a variable as pid=$! 

# Waits until the process 'sleep 3' is completed. Here the wait on a single process is done by capturing its process id 

echo "I am waking up" 

sleep 4 & 
sleep 5 & 

wait     # Without specifying the id, just 'wait' waits until all jobs started on the background is complete. 

echo "I woke up again" 

コマンド

$ time ./mywaitscript.sh 
I am waking up 
I woke up again 

real 0m8.012s 
user 0m0.004s 
sys  0m0.006s 

ouputをあなたは、スクリプトが完了するまで実行するために〜8Sをとっている見ることができます。時間の内訳は

  1. sleep 3

  2. sleep 4sleep 5の両方が順次次々に開始され、その実行を完了するために、完全な3秒かかりますし、それがあるMAX(4,5)をとっています約5秒走る。

上記の質問にも同様のロジックを適用できます。希望があなたの質問に答えることを望みます。

+0

@Camusensei:更新されました!私は特別な変数が別の変数にもどのように格納されるかを実証するためにそれをしなければなりませんでした。 – Inian

+0

編集していただきありがとうございます。あなただけが 'pid = $(echo $!)'から 'pid = $!' ...にコメントを変更できるならば – Camusensei

0

あなたのコードには他にも多くの問題がありますが、使用する前にanywaitを宣言する必要があります(スクリプト内で動かす)。

少なくとも、スクリプトで最も明白なエラーやミスを抑制するために、http://www.shellcheck.net/を使用することを検討してください。

関連する問題