Bash

Bash 執行多個程序並處理關閉

  • June 30, 2020

我有一個執行多個程序的 bash 腳本

#!/bin/sh
python program1.py &
python program2.py &
other programs ... &
lastProgram

我執行它./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

TrappingEXIT在 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

如果您執行產生其他程序的後台程序(如子外殼:)(sleep 1234 ; echo foo) &,則需要使用set -m(“監控模式”)啟用作業控制才能使其工作。否則僅終止引導過程。

引用自:https://unix.stackexchange.com/questions/361955