일반적으로 하위 프로세스는 악몽이라고 생각합니다. 다음과 같은 경우:
#!/usr/bin/env bash
( proc_one ) &
( proc_two ) &
wait
이 스크립트를 Ctrl-C로 눌러도 백그라운드에서 계속 실행되어 터미널에 입력하는 모든 내용이 중단됩니다. 결국 터미널을 닫았습니다.
터미널을 통해 하위 프로세스를 쉽게 종료할 수 있는 모드가 있나요?
답변1
이 문제를 해결하기 위한 몇 가지 옵션이 있습니다.
첫째, 터미널로 보내는 출력을 무시할 수 있습니다. 하지만 이것이 너무 방해가 된다면 다음을 사용하여 터미널에 수락을 중지하도록 지시할 수 있습니다.stty tostop
둘째, 이러한 일자리를 죽일 수 있습니다. 명령을 사용하여 ps t
찾은 다음 pid로 종료하십시오.
창에 출력이 너무 많으면 다른 창을 열고 거기에서 종료할 수 있습니다. (그러나 이것은 ps t
일반에서는 작동하지 않습니다. t 옵션에 다른 창의 tty 이름을 지정해야 합니다.) 또는 tostop을 사용하여 출력을 중지한 다음 종료합니다.
또 다른 방법은 이 문제를 해결하기 위해 스크립트를 수정하는 것입니다. 스크립트가 각 프로세스를 시작하면 각 프로세스 ID를 기록 $!
하고 이를 변수에 저장할 수 있습니다. 그런 다음 스크립트는 ctrl-c를 잡을 수 있으며 그런 일이 발생하면 ctrl-c를 수행하고 종료하기 전에 두 작업 자체를 모두 종료할 수 있습니다.
답변2
zzOne입니다.
#! /bin/bash
Killer () {
printf 1>&2 '\n.. Killing %s' "${Pids[@]}"
kill -SIGKILL "${Pids[@]}"
}
trap 'Killer' SIGINT
./zzTwo 5 4 & Pids+=( "${!}" )
./zzTwo 3 7 & Pids+=( "${!}" )
wait
printf 1>&2 '\n.. %s exits\n' "${$}"
다음은 zzTwo입니다(다른 간격으로 proc_xxx를 에뮬레이트함).
#! /bin/bash
for (( j = 0; j < "${1}"; j++ )); do
printf 1>&2 'Pid %d at %(%T)T\n' "${$}" -1
sleep "${2}"
done
printf 1>&2 'Pid %d exits at %(%T)T\n' "${$}" -1
그리고 테스트하세요:
$ ./zzOne
Pid 10951 at 22:35:28
Pid 10952 at 22:35:28
Pid 10951 at 22:35:32
Pid 10952 at 22:35:35
Pid 10951 at 22:35:36
^C
.. Killing 10951
.. Killing 10952
.. 10950 exits
$
약간 장황하지만 source
Killer 기능을 사용하면 여러 스크립트에 갇힐 수 있습니다.