2012-04-06 58 views
2

在Linux上,我想生成一些服务器作为后台服务。在后台启动程序,并在其中一个死机并退出代码时立即杀死它们

只要其中一人退出代码终止!= 0,他们应当所有被SIGTERMed,和3秒后的宽限期内杀死,如果他们不想去。

按下Ctrl-C时也会发生同样的情况。

我想要的

set -e 
server1 & 
server2 & 
server3 & 
wait (+ kill on error) 

大致相当于(不幸的是上面的代码确实具有上述所有属性。)

它应是孩子们能够窃取/逃生Ctrl-C信号。

猛砸接受的解决方案的Python(使用subprocess)。对于Python来说,它们只能使用标准库函数(没有必要先下载模块pip)。如果你有一种很酷的方式来用另一种语言来做到这一点,请不要犹豫,以显示它。

奖励积分,如果它也适用于Mac OS。

+1

什么将我的奖励积分组成的呢?这是钱吗? – aaronasterling 2012-04-06 00:56:27

+1

一个字:supervisord – jldupont 2012-04-06 01:59:42

+0

@jldupont为什么不加监督员作为一个答案,所以我们可以讨论一下? – nh2 2012-08-01 00:44:00

回答

1

与其为您写解决方案,我会建议去哪里寻找:setpgrpwaitpidkill。请注意,“儿童不能偷走/逃离Ctrl-C信号。”既不是可能的(即不可回避的唯一信号是SIGSTOPSIGKILL)也没有意义(你是不是提供SIGINT他们)。

由于wait等待所有指定的(或者,如果没有指定,只是所有)进程,您无法在bash中正确执行此操作;你需要“任何”语义,而不是“全部”。

0

技术上可以直接在bash要做到这一点,但我不会,因为它需要大量的投票,将是效率低下,而且容易出错(基本上,你必须kill -0 $pid测试过程是否犹在)。这里有一点bash的代码(从剧本我已经躺在附近),显示如何录制背景程序PID:

start_tail() { 
    if [ x$TAIL_PID != x ]; then 
     echo "internal error: already running tail (pid $TAIL_PID)" 
    fi 
    tail -0f $1 & 
    TAIL_PID=$! 
    trap "kill $TAIL_PID" 0 1 2 3 15 
} 

stop_tail() { 
    if [ x$TAIL_PID != x ]; then 
     kill $TAIL_PID; trap 0 1 2 3 15 
     TAIL_PID="" 
    fi 
} 

,并在这个特殊的情况下,你很可能使其更好地工作(除上述以外,其是故意限制的)使用“协同处理”和一点点黑客攻击。

这将是在Python更容易,但不要使用subprocess;使用直接的OS调用(如上面描述的@geekosaur)。 @ jldupont对http://supervisord.org/的推荐看起来很不错(特别是因为它是用Python编写的)。

0
#!/bin/sh 
# Avoid <() process substitutions for portability's sake 
set -bm 
trap clean SIGCHLD 
trap 'kill 0' SIGINT 
trap 'sleep 3; kill -9 0' SIGTERM 

clean() { 
     while read spec pid extra; do 
       wait $pid || kill 0 
     done << EOF 
       $(jobs -l | grep 'Exit\|Done') 
EOF 
} 

server1 & 
server2 & 
server3 & 
wait 
相关问题