KornShell(ksh)脚本如何退出/终止从另一个ksh脚本启动的所有进程?
如果scriptA.ksh调用scriptB.ksh,那么下面的代码就足够了,但是有更好的解决方案吗?:
scriptA.ksh:
#call scriptBSnippet
scriptBSnippet.ksh ${a}
scriptB.ksh:
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
要增加复杂性,如果scriptA调用调用scriptC的scriptB,那么如果scriptC中有错误,如何退出所有三个脚本?
scriptA.ksh:
#call scriptBSnippet
scriptBSnippet.ksh ${a}
scriptB.ksh:
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
scriptC.ksh:
#if error: exit this script (scriptC) and calling scripts (scriptA, scriptB)#
#kill ${PPID}
#exit 1
提前致谢。
答案 0 :(得分:1)
杀死由同一个脚本启动的所有进程是一种强力方法。
最好在进程之间建立一些通信方法,使它们能够正常关闭。
但是,如果所有进程都在同一进程组中,您可以向整个进程组发送信号:
kill -${Signal:?} -${Pgid:?}
请注意,在这种情况下需要两个参数。以-
开头的单个参数始终被解释为信号。
运行一些测试以查看哪些进程包含在进程组中。
parent.sh:
Shell=ksh
($Shell -c :) || exit
$Shell child1.sh & pid1=$!
$Shell child2.sh & pid2=$!
$Shell child3.sh & pid3=$!
ps -o pid,sid,pgid,tty,cmd $PPID $$ $pid1 $pid2 $pid3
exit
child.sh:
sleep 50
如果您从终端运行parent.sh
,它将成为流程负责人。
granny.sh:
Shell=ksh
($Shell -c :) || exit
$Shell parent.sh &
wait
exit
如果您从另一个脚本parent.sh
运行granny.sh
,那么 将成为流程组负责人,并且在您使用kill -SIG -PGID
方法时将包括在内
另见这个答案:
What are “session leaders” in ps
?了解会话和流程组的一些背景知识。