如何在子进程挂起后杀死它,使其不会';t阻止父对象(BASH)

如何在子进程挂起后杀死它,使其不会';t阻止父对象(BASH),bash,shell,scripting,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)

我有下面的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_服务作为子进程运行,然后在父进程上能够判断子进程是否挂起并杀死它,或者能够将其执行与父进程分离,以便它在停止时不会挂起


每次我运行此脚本,并且子进程停止响应或挂起时,它会在停止服务$servicename&line之后停止执行父进程的每一行。

我认为简单的方法更好,只需输出子进程的id即可 然后把它加到杀戮中,就像这样

id=$process_id
kill $id

我认为简单的方法更好,只需输出子进程的id 然后把它加到杀戮中,就像这样

id=$process_id
kill $id

父进程将一直运行到脚本的最后一行。但是,它必须等待生成的所有子进程,才能释放其执行/进程

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

在脚本中,使用
&

stop_service $servicename &
然后,立即通过
$获取进程id(PID)

proc_id=$!
下面将循环几秒钟,查看child是否已完成(否则会突然终止该child),并尝试终止该服务

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

父进程将一直运行到脚本的最后一行。但是,它必须等待生成的所有子进程,才能释放其执行/进程

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

在脚本中,使用
&

stop_service $servicename &
然后,立即通过
$获取进程id(PID)

proc_id=$!
下面将循环几秒钟,查看child是否已完成(否则会突然终止该child),并尝试终止该服务

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

似乎您需要某种看门狗功能。让您的子进程记录到某个文件或每隔几秒钟更新它的状态,然后从其他进程检查更新是否太旧。如果是,则重新启动您的子进程。一旦您在stop_服务后应用
&
,它将派生一个子进程。该子级创建脚本作用域中变量的快照,但更新这些变量不会更改父变量。仅更改子进程快照。查看SHM并“发送事件”给家长。您似乎需要某种看门狗功能。让您的子进程记录到某个文件或每隔几秒钟更新它的状态,然后从其他进程检查更新是否太旧。如果是,则重新启动您的子进程。一旦您在stop_服务后应用
&
,它将派生一个子进程。该子级创建脚本作用域中变量的快照,但更新这些变量不会更改父变量。仅更改子进程快照。查看SHM-并“发送事件”给家长我可以编辑您的答案,看起来这个单词过滤器仅适用于低代表性用户。另一方面,你确定这里需要反向引号吗?是的,我错了,应该是美元符号,改变了…)像那样工作很好。。。选中的!问题是,一旦子进程崩溃,父进程也会停止,我无法杀死它。嗯,我可以理解相反的情况,这是有意义的,但这没有意义,你不能使用nohup(无挂断)吗或者类似的东西来区分他们之间的关系,这样他们就看不到对方在做什么。这样就可以解决你的问题了。@JoaoAlmeida我只是在复习我以前的一些答案,我记得,我不知道你是否最终解决了这个问题,但为了记录在案,如果你没有解决,请查看僵尸程序,因为我想这就是这里发生的事情,可能会对你有所帮助。使用
kill-s SIGCHLD
将告诉父进程终止其子进程,并且通过父进程终止,父进程不会崩溃,因为他正在执行“合法”操作。看看这个参考资料,我可以编辑你的答案,看起来这个单词过滤器只适用于低重复率的用户。另一方面,你确定这里需要反向引号吗?是的,我错了,应该是美元符号,改变了…)像那样工作很好。。。选中的!问题是,一旦子进程崩溃,父进程也会停止,我无法杀死它。嗯,我可以理解相反的情况,这是有意义的,但这没有意义,你不能使用nohup(无挂断)吗或者类似的东西来区分他们之间的关系,这样他们就看不到对方在做什么。这样就可以解决你的问题了。@JoaoAlmeida我只是在复习我以前的一些答案,我记得,我不知道你是否最终解决了这个问题,但为了记录在案,如果你没有解决,请查看僵尸程序,因为我想这就是这里发生的事情,可能会对你有所帮助。使用
kill-s SIGCHLD
将告诉父进程终止其子进程,并且通过父进程终止,父进程不会崩溃,因为他正在执行“合法”操作。看看这个参考资料,