我有以下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&之后执行父进程的每一行。线。
答案 0 :(得分:0)
我认为简单方法更好,只输出子进程的id 并添加它以杀死,所以像这样。
id=$process_id
kill $id
答案 1 :(得分:0)
父进程一直运行到脚本中的最后一行。但是它必须等待它生成的任何子进程,以便它释放它的执行/进程。
根据您的用例,您可以做的是在父级中循环一段时间,并查看子级是否完成。
在您的脚本中,使用&
stop_service $servicename &
然后立即通过$!
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