Bash에 의해 시작된 하위 프로세스를 쉽게 종료할 수 없습니다.

Bash에 의해 시작된 하위 프로세스를 쉽게 종료할 수 없습니다.

일반적으로 하위 프로세스는 악몽이라고 생각합니다. 다음과 같은 경우:

#!/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
$ 

약간 장황하지만 sourceKiller 기능을 사용하면 여러 스크립트에 갇힐 수 있습니다.

관련 정보