2014-01-08 27 views
2

KornShell(ksh)脚本如何退出/终止从另一个ksh脚本启动的所有进程?退出所有被调用的KornShell(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调用scriptB什么它要求SCR iptC,那么如果在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

杀死由同一脚本启动的所有进程是一种暴力方法。

最好在进程之间有一些方法可以让它们正常关闭。

但是,如果所有的过程都是一样的进程组中,您可将信号发送到整个进程组:

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 

如果你从另一个脚本运行granny.shparent.sh,然后将进程组领导者,当您使用kill -SIG -PGID方法将包括在内。

另请参阅: What are “session leaders” in ps?关于会话和进程组的一些背景知识。

+0

这些ksh脚本(scriptA,scriptB,scriptC)应尽可能分离,每个脚本应尽可能少地使用输入参数。此解决方案将需要添加输入参数... – javaPlease42

+1

此解决方案绝对需要更多工作。 –

+0

如果每个脚本都可以将自己放在同一个进程组(Pgid)中,那么这可能会起作用,那么有关如何做到这一点的任何见解? – javaPlease42

相关问题