【问题标题】:Exit all called KornShell (ksh) scripts退出所有调用的 KornShell (ksh) 脚本
【发布时间】:2014-01-08 21:44:22
【问题描述】:

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 调用 scriptB 而 scriptB 又调用 scriptC,那么如果 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

提前致谢。

【问题讨论】:

    标签: shell unix scripting ksh exit-code


    【解决方案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,那么 that 将成为进程组负责人,并且在您使用 kill -SIG -PGID 方法时将被包括在内。

    另请参阅以下答案: What are “session leaders” in ps? 了解有关会话和进程组的一些背景信息。

    【讨论】:

    • 这些ksh脚本(scriptA,scriptB,scriptC)应该尽可能的解耦,每个脚本的输入参数应该尽可能的少。此解决方案将需要添加输入参数...
    • 如果每个脚本都可以将自己置于同一个进程组 (Pgid) 中,那么这可能会起作用,那么对于如何做到这一点有任何见解吗?
    • 这应该是默认的。更新了答案以帮助您展示。
    • 这是一个 ksh 问题而不是 sh 问题:-)
    • 我尝试使用多个 shell 测试解决方案,看看它们有何不同。现已修复 :-)
    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 2012-01-02
    • 2012-09-17
    • 2010-09-13
    • 2012-11-03
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多