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

退出所有被称为KornShell(ksh)的脚本,shell,unix,scripting,ksh,exit-code,Shell,Unix,Scripting,Ksh,Exit Code,KornShell(ksh)脚本如何退出/终止从另一个ksh脚本启动的所有进程 如果scriptA.ksh调用scriptB.ksh,那么下面的代码工作得足够好,但是有更好的解决方案吗 scriptA.ksh: #call scriptBSnippet scriptBSnippet.ksh ${a} #if error: exit this script (scriptB) and calling script (scriptA)# kill ${PPID} exit 1 #call scr

KornShell(ksh)脚本如何退出/终止从另一个ksh脚本启动的所有进程

如果scriptA.ksh调用scriptB.ksh,那么下面的代码工作得足够好,但是有更好的解决方案吗

scriptA.ksh:

#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#if error: exit this script (scriptC) and calling scripts (scriptA, scriptB)#
#kill ${PPID}
#exit 1
scriptB.ksh:

#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#if error: exit this script (scriptC) and calling scripts (scriptA, scriptB)#
#kill ${PPID}
#exit 1
为了增加复杂性,如果scriptA调用scriptB而scriptB调用scriptC,那么如果scriptC中出现错误,如何退出所有三个脚本

scriptA.ksh:

#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#if error: exit this script (scriptC) and calling scripts (scriptA, scriptB)#
#kill ${PPID}
#exit 1
scriptB.ksh:

#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#if error: exit this script (scriptC) and calling scripts (scriptA, scriptB)#
#kill ${PPID}
#exit 1
scriptC.ksh:

#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#call scriptBSnippet
scriptBSnippet.ksh ${a}
#if error: exit this script (scriptB) and calling script (scriptA)#
kill ${PPID}
exit 1
#if error: exit this script (scriptC) and calling scripts (scriptA, scriptB)#
#kill ${PPID}
#exit 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.sh
运行
parent.sh
,则该脚本将成为流程组长,并将在您使用
kill-SIG-PGID
方法时包含在内

另请参见以下答案:
这些ksh脚本(scriptA、scriptB、scriptC)应该尽可能地解耦,并且每个脚本应该有尽可能少的输入参数。此解决方案将需要添加输入参数…如果每个脚本都可以将自己放在同一个进程组(Pgid)中,那么这可能会起作用,因此了解如何做到这一点吗?这应该是默认设置。更新了答案以帮助您展示。这是一个ksh问题而不是sh问题:-)我尝试使用多个shell测试解决方案,以查看它们之间的差异。现已修复:-)