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
,它退出,所有其他程序继续在后台运行。问题是其他程序需要终止。
哪种方法可以正确处理从脚本启动的所有程序的关闭?
收集进程 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
(“监视模式”)启用作业控制才能使其正常工作。否则仅终止引导进程。