![하위 쉘 백그라운드 프로세스가 상위 프로세스의 SIGINT에서 종료되지 않는 이유는 무엇입니까?](https://linux55.com/image/209335/%ED%95%98%EC%9C%84%20%EC%89%98%20%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EC%83%81%EC%9C%84%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98%20SIGINT%EC%97%90%EC%84%9C%20%EC%A2%85%EB%A3%8C%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음 스크립트가 있습니다test.sh
#!/bin/bash
function cleanup() {
echo "calling cleanup"
echo "PIDs associated with $0"
ps aux | grep $0
echo "killing $$ $(jobs -p)"
kill $(jobs -p | xargs)
exit 0
}
function subshell() (
echo "subshell pid $BASHPID"
while true
do
echo "subshell running..."
sleep 5
done
)
function no_subshell() {
echo "no_subshell pid $BASHPID"
while true
do
echo "no_subshell running..."
sleep 10
done
}
# Main
echo "test.sh pid $$"
trap "exit" INT TERM SIGUSR1
trap cleanup EXIT
subshell &
no_subshell &
echo "Waiting..."
jobs -l
wait
내 기대는 상위 프로세스에서 SIGINT가 호출되면 및 test.sh
기능 도 정리되어야 한다는 것입니다. 그러나 실제로 제가 관찰한 바는 다음과 같습니다.subshell
no_subshell
./test.sh
test.sh pid 49199
Waiting...
[1]- 49200 Running subshell &
[2]+ 49201 Running no_subshell &
no_subshell pid 49201
no_subshell running...
subshell pid 49202
subshell running...
^Ccalling cleanup
PIDs associated with ./test.sh
root 49199 0.0 0.0 106144 2896 pts/1 S+ 03:43 0:00 /bin/bash ./test.sh
root 49200 0.0 0.0 106144 232 pts/1 S+ 03:43 0:00 /bin/bash ./test.sh
root 49201 0.0 0.0 106144 2248 pts/1 S+ 03:43 0:00 /bin/bash ./test.sh
root 49202 0.0 0.0 106144 2248 pts/1 S+ 03:43 0:00 /bin/bash ./test.sh
root 49206 0.0 0.0 103488 2184 pts/1 S+ 03:43 0:00 grep ./test.sh
killing 49199 49200
49201
SIGINT 이후에 subshell
함수는 PID 49202에서 계속 실행됩니다. 이 값은 jobs -l
내 cleanup
함수에 나열되지 않습니다.
px aux | grep test
root 49202 0.0 0.0 106144 2248 pts/1 S 03:43 0:00 /bin/bash ./test.sh
또한 서브쉘 기능은 PID 49200에 의해 추적되고 및에 의해 보고되는 것처럼 보이지만 jobs -p
(아마도 종료되었을 수 있음) 서브쉘 기능은 PID 49202에 여전히 존재하는 것 같습니다.
내가 관찰한 이 행동을 어떻게 설명할 수 있나요? test.sh
백그라운드에서 실행 중인 하위 셸 기능을 어떻게 정리할 수 있나요 ?
답변1
kill 명령은 동일한 프로세스 그룹(PPID)에 속하는 프로세스만 종료합니다. 프로그램 PPID는 2896인 것 같지만 subshell 및 no_subshell PPID는 2248입니다.