我有两个后台进程1和2
./1.sh &
PID_1 = $!
./2.sh &
PID_2 = $!
我正在尝试确定首先完成的流程然后杀死仍在继续的流程。这是我正在制作的剧本。
while ps -p | grep " $PID_1"
do
## process 1 is still running
### check for process 2
if ! ps -p | grep "$PID_2"
then
### process 2 is complete, so kill process 1
kill $PID_1
fi
done
kill $PID_2 ## process 2 is still running, so kill it
虽然这个脚本有效,但我正在寻找是否还有其他更好的方法。
答案 0 :(得分:1)
您可以使用这种简单的方法完成此任务:
trap SIGCHLD
在脚本开头注册自定义处理程序。jobs -l
查看哪个子进程仍在运行,并kill
。答案 1 :(得分:0)
你可以使用等待。有点像...
(1.sh& wait $!; killall 2.sh)&
(2.sh& wait $!; killall 1.sh)&
答案 2 :(得分:0)
以这种方式试试
while true
do
res1=`ps -p | grep -c "$PID_1"`
res2=`ps -p | grep -c "$PID_2"`
#grep command itslef will consume one pid hence if grep -c = 1 then no process else if greator than process is running
if [ $res1 -eq 1 ]
then
kill -9 $PID_2;
exit
#exit while loop and script
elif [ $res2 -eq 1 ]
kill -9 $PID_1;
exit
#exit while loop and script
fi
done
grep -c将给出该pid的行数 因为grep在ps -ef中只有一个输出,因为它也作为PID运行,它至少有1个结果
即使你ps -ef | grep someID 将有一个grep的pid