複数のプログラムを実行するbashスクリプトがあります
#!/bin/sh
python program1.py &
python program2.py &
other programs ... &
lastProgram
私はそれを次のように実行します。./myscript.sh
Ctrl+を押して閉じると終了CしlastProgram
、他のすべてのプログラムはバックグラウンドで実行され続けます。問題は他のプログラムを終了しなければならないという点だ。
스크립트에서 시작된 모든 프로그램의 종료를 올바르게 처리하는 방법은 무엇입니까?
ベストアンサー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
그렇지 않으면 부팅 프로세스만 종료됩니다.