如何挂起子进程,以便它不会阻止父进程(BASH)

时间:2016-04-13 09:10:55

标签: bash shell scripting

我有以下bash脚本。

#!/bin/bash

stop_service {
  $(service $1 stop)
}

servicename=$(inictl list | grep $1 | cut -d ' ' -f1)
servicestate=$(initctl list | grep "$1" | cut -d ' ' -f2)
servicepid=$(initctl list | grep  "$1" | cut -d "," -f2 | cut -d " " -f3)
stop_service $servicename &

if [ \( $servicestate = "stop/killed," \) -o \( $servicestate = "start/killed," \) ] ;then
   /upstartCleaner/upstartCleaner $servicepid
   echo "Command executed"
else
  echo "The service didnt crash"
fi

我想要做的是将stop_service作为子进程运行,然后在父进程上能够判断子进程是否被挂起并将其终止,或者能够将其执行从父进程分离,以便它不会&# 39;停止时挂起。

每次运行此脚本并且子进程停止响应或挂起时,这将停止在stop_service $ servicename&之后执行父进程的每一行。线。

2 个答案:

答案 0 :(得分:0)

我认为简单方法更好,只输出子进程的id 并添加它以杀死,所以像这样。

id=$process_id
kill $id

答案 1 :(得分:0)

父进程一直运行到脚本中的最后一行。但是它必须等待它生成的任何子进程,以便它释放它的执行/进程。

根据您的用例,您可以做的是在父级中循环一段时间,并查看子级是否完成。

在您的脚本中,使用&

分叉您的子流程
stop_service $servicename &

然后立即通过$!

获取进程ID(PID)
proc_id=$!

以下内容将循环几秒钟,看看孩子是否已经完成 - 否则会突然杀死孩子 - 并试图杀死该服务。

for i in `seq 1 5`; do
   if [ -d /proc/$proc_id ]; then
      # child is alive
      sleep 1s
   else
       break
   fi
done
if [ -d /proc/$proc_id ]; then
   # child did not complete within time
   kill $proc_id
   ps -ef | grep your_process_name | grep -v grep | awk '{print $2}' | xargs kill
fi