处理bash中的后台进程

时间:2013-10-28 10:36:45

标签: bash background-process

我有两个后台进程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

虽然这个脚本有效,但我正在寻找是否还有其他更好的方法。

3 个答案:

答案 0 :(得分:1)

您可以使用这种简单的方法完成此任务:

  1. 使用 trap SIGCHLD 在脚本开头注册自定义处理程序。
  2. 每次退出后台(子)进程时,都会调用此自定义处理程序。
  3. 在自定义处理程序中,使用 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