【问题标题】:How to kill all processes that were opened by a shell script upon ctrl + C?如何在 ctrl + C 上杀死由 shell 脚本打开的所有进程?
【发布时间】:2013-03-22 05:02:37
【问题描述】:

我有几个 python 脚本,我从一个 shell 脚本开始,如下所示:

#!/bin/bash
python prog1.py &
python prog2.py &
python prog3.py 

由于我正在开发,我经常想停止这些过程。我通常通过按 ctrl+C 来做到这一点,但不幸的是,一些 python 程序保持 (zeromq) 套接字打开。这意味着我必须手动找到它们(我使用 lsof -i),并使用 PID 杀死它们。

所以我正在寻找一种更简单的方法,以便在我按下 ctrl+C 时自动从 shell 中杀死那些 python 进程。在another thread here on Stackoverflow 上,我发现了一些应该可以满足我需要的代码。我只是不了解代码以及如何根据需要对其进行调整。

有人会这么好心来帮助我吗?

cat >work.py <<'EOF'
import sys, time, signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
for i in range(10):
    time.sleep(1)
    print "Tick from", sys.argv[1]
EOF 
chmod +x work.py

function process {
    python ./work.py $1
}

process one &
wait $!
echo "All done!"

【问题讨论】:

    标签: bash


    【解决方案1】:

    让 bash 脚本捕获 SIGINT,并让它杀死当前进程组中的所有内容:

    intexit() {
        # Kill all subprocesses (all processes in the current process group)
        kill -HUP -$$
    }
    
    hupexit() {
        # HUP'd (probably by intexit)
        echo
        echo "Interrupted"
        exit
    }
    
    trap hupexit HUP
    trap intexit INT
    
    python prog1.py &
    python prog2.py &
    python prog3.py &
    
    wait
    

    【讨论】:

    • +1 很好,我试图创建具有作业控制的相同脚本,但我非常失望 bash 没有提供指定多个作业的方法。 kill %?python 是有道理的。
    • 太棒了!非常感谢!就一个问题;我将您的代码最小化为下面的代码,它似乎工作相同。剩下的干什么? #!/bin/bash intexit() { kill -HUP -$$;出口; } 陷阱 intexit INT python prog1.py & python prog2.py & python prog3.py
    • hupexit 打印出一个很好的消息,wait 只是为了让代码看起来更统一(我们在后台启动所有内容并等待)。
    • 但是 hupexit HUP 的陷阱是什么?
    • 当程序在 ssh 远程上运行时,这非常有效。但是当我在机器 B 上运行它时,它是从 A ssh'ed 的,而 A 又是从我的本地机器上 ssh'ed 的,ctrl + c 停止所有 stdout 和 stderr 消息,但进程仍在根据顶部运行。你知道为什么双 ssh 转发会使 ctrl + c 不能正常工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2011-02-06
    • 2018-06-29
    • 1970-01-01
    • 2021-12-15
    • 2019-07-13
    相关资源
    最近更新 更多