bash의 작업 제어를 사용하여 EXIT를 포착하고 종료하세요.

bash의 작업 제어를 사용하여 EXIT를 포착하고 종료하세요.

複数のプログラムを実行するbashスクリプトがあります

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

私はそれを次のように実行します。./myscript.sh

Ctrl+を押して閉じると終了ClastProgram、他のすべてのプログラムはバックグラウンドで実行され続けます。問題は他のプログラムを終了しなければならないという点だ。

스크립트에서 시작된 모든 프로그램의 종료를 올바르게 처리하는 방법은 무엇입니까?

ベストアンサー1

종료 시 프로세스 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

EXIT이유에 관계없이 캡처는 셸이 종료될 때 함수를 실행합니다. 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

다른 프로세스(예: subshell: )를 생성하는 백그라운드 프로세스를 실행하는 경우 이 프로세스가 제대로 작동하려면 ("모니터 모드")를 사용하여 작업 제어를 활성화 (sleep 1234 ; echo foo) &해야 합니다 . set -m그렇지 않으면 부팅 프로세스만 종료됩니다.

おすすめ記事