退出所有名为KornShell(ksh)的脚本

时间:2014-01-08 21:44:23

标签: shell unix scripting ksh exit-code

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

提前致谢。

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?了解会话和流程组的一些背景知识。