Linux 等待一个进程完成并执行另一个进程
我想在进程之间进行同步。我的计算机有2个核心。用户可以从命令行输入模拟数。如果输入大于2,则第3个进程和其余进程必须等待其中一个进程完成。如果其中一个进程完成,则应执行下一个进程。例如,前2个进程已经在进行,假设第1个进程在第2个进程之前完成。现在应该执行第3个进程。我发现我在bash中是新手。可以看到anywait:命令未找到。我该如何执行?这是我的剧本:Linux 等待一个进程完成并执行另一个进程,linux,bash,shell,ubuntu,Linux,Bash,Shell,Ubuntu,我想在进程之间进行同步。我的计算机有2个核心。用户可以从命令行输入模拟数。如果输入大于2,则第3个进程和其余进程必须等待其中一个进程完成。如果其中一个进程完成,则应执行下一个进程。例如,前2个进程已经在进行,假设第1个进程在第2个进程之前完成。现在应该执行第3个进程。我发现我在bash中是新手。可以看到anywait:命令未找到。我该如何执行?这是我的剧本: #!/bin/bash # My first script count=2 echo -n "Please enter the numb
#!/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
}
您可以在
bash
中使用wait
实现进程同步的简单方法,它在运行下一个作业之前等待一个或多个后台作业完成
通常通过在命令末尾附加&
运算符在后台运行作业。此时,新创建的后台进程的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秒。时间的细目是
sleep3
需要整整3秒才能完成执行sleep 4
和sleep 5
都是一个接一个顺序启动的,它已经达到了最大值(4,5),大约运行5秒您可以将类似的逻辑应用于上述问题。希望这能回答您的问题。您的代码还有许多其他问题,但答案是您应该在使用它之前声明anywait(因此在脚本中向上移动它)
请考虑使用以至少抑制脚本中最明显的错误/错误。
@ CAMUSESESE:更新!我必须这样做,以演示如何将特殊变量也存储在另一个变量中。感谢您的编辑。现在,如果您可以将注释从pid=$(echo$!)
更改为pid=$代码>…:)您是否能够像我的回答中那样使用wait
命令解决您的问题?您可以使用select语句进行用户响应,等待等待,如果您仍然需要ps,那么pgrep更好。