2016-05-13 205 views
2

我想在進程之間進行同步。我的計算機有2個核心。用戶可以從命令行輸入模擬編號。如果輸入大於2,則第3次休息進程必須等待其中一個進程完成。如果其中一個完成,則應執行下一個進程。例如,前兩個進程已經在進行,並假設第1個進程在第2個進程之前完成。現在第3個進程應該被執行。我是bash新手,我想通了。可以看到anywait:command not found。我該怎麼做?這裏是我的腳本:等待一個進程完成並執行另一個進程

#!/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 statings來獲得用戶響應,等待等待,如果你仍然需要ps,那麼pgrep會更好。 – SaintHax

回答

6

可以使用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 

你可以看到腳本已經採取〜8秒完成運行。在時間的細分

  1. sleep 3將充分3S完成執行

  2. sleep 4sleep 5都開始依次進行一個未來後,也採取了MAX(4,5),這是大約〜5s跑步。

您可以將類似的邏輯應用於上述問題。希望這回答你的問題。

+0

@Camusensei:更新!我必須這樣做來演示如何將特殊變量存儲在另一個變量中。 – Inian

+0

感謝您的編輯。現在,如果只有您可以將註釋從'pid = $(echo $!)'更改爲'pid = $!'... :) – Camusensei

0

你的代碼有很多其他的問題,但答案是你應該在使用它之前聲明anywait(所以在你的腳本中移動它)。

請考慮使用http://www.shellcheck.net/以至少抑制腳本中最明顯的錯誤/錯誤。