Bash 运行多个程序并处理关闭

Ric*_*ins 3 bash kill shell-script background-process

我有一个运行多个程序的 bash 脚本

#!/bin/sh
python program1.py &
python program2.py &
other programs ... &
lastProgram
Run Code Online (Sandbox Code Playgroud)

我运行它作为./myscript.sh

当我按Ctrl+C关闭它时lastProgram,它退出,所有其他程序继续在后台运行。问题是其他程序需要终止。

哪种方法可以正确处理从脚本启动的所有程序的关闭?

ilk*_*chu 5

收集进程 ID,退出时终止后台进程。

#!/bin/bash
killbg() {
        for p in "${pids[@]}" ; do
                kill "$p";
        done
}
trap killbg EXIT
pids=()
background job 1 & 
pids+=($!)
background job 2... & 
pids+=($!)
foreground job
Run Code Online (Sandbox Code Playgroud)

EXIT无论原因如何,当 shell 退出时,捕获都会运行该函数。您可以将其更改为trap killbg SIGINT仅在^C.

这不会检查后台进程之一在脚本尝试启动它们之前是否已退出。如果这样做,您可能会出错,或者更糟糕的是,拍摄错误的流程。


或者通过工作 ID 杀死他们。让我们阅读 的输出,jobs找出哪些仍然处于活动状态。

#!/bin/bash 
killjobs() {
    for x in $(jobs | awk -F '[][]' '{print $2}' ) ; do 
        kill %$x
    done
}
trap killjobs EXIT
sleep 999 &
sleep 1 &
sleep 999 &
sleep 30
Run Code Online (Sandbox Code Playgroud)

如果您运行生成其他进程的后台进程(例如子 shell: (sleep 1234 ; echo foo) &),则需要使用set -m(“监视模式”)启用作业控制才能使其正常工作。否则仅终止引导进程。