질문이 있습니다. 프로세스 관리를 연구하는 동안 CentOS 7에서 이상한 동작을 관찰했습니다. 상위 프로세스가 종료되면 하위 프로세스도 종료되는 것으로 알고 있습니다. 다만, 다음의 경우에는 그렇지 않습니다. 예를 들어 dd 명령을 실행했습니다.
[root@server2 ~]# dd if=/dev/zero of=/dev/null &
[1] 1756
[root@server2 ~]# ps fax | grep -B2 dd
1737 pts/2 S 0:00 \_ su -
1741 pts/2 S 0:00 \_ -bash
1756 pts/2 R 1:18 \_ dd if=/dev/zero of=/dev/null
그런 다음 bash인 상위 프로세스를 종료(SIGKILL 신호 사용)하려고 시도하지만 이 작업은 dd 프로세스를 종료하지 않습니다.
[root@server2 ~]# kill -9 1741
Killed
[user@server2 ~]#
셸은 종료되지만 최상위 명령 출력에서 볼 수 있듯이 dd 프로세스는 계속 작동합니다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1756 root 20 0 107948 612 512 R 99.9 0.1 10:06.98 dd
이에 대해 어떤 생각이 있습니까?
답변1
기본적으로 상위 프로세스를 종료해도 하위 프로세스는 종료되지 않습니다.
프로세스 그룹(음수 PID)을 사용하여 상위 및 하위 프로세스를 종료하는 방법에 대한 다른 질문을 찾아보는 것이 좋습니다.
이 작업을 수행하는 방법에 대한 자세한 답변은 다음에서 찾을 수 있습니다.프로세스 자손
답변2
비슷한 상황에 부딪혀 답을 찾았습니다.
너무 오래;
노력하다:kill -2 <parent_pid>
Ctrl스크립트를 실행하는 동안 +를 누르면 C상위 프로세스와 생성된 모든 프로세스가 종료되는 경우 이 방법이 효과가 있는지 알 수 있습니다.
그 이유는 kill
다양한 신호가 전송될 수 있기 때문입니다. 신호는 기본적으로 kill <pid>
전송됩니다 15 <SIGTERM>
. 하지만 Ctrl+를 누를 때의 일반 신호는 실제로는 그렇지 않습니다 C.15 <SIGTERM>
2 <SIGINT>
따라서 이것이 +로 중단하는 것과 kill -2 <pid>
같이 상위 프로세스를 종료하는 경우CtrlC
답변3
특히 kill 명령의 경우 필요에 따라 조정하십시오.
function kill_recurse() {
cpids=`pgrep -P $1|xargs`
for cpid in $cpids;
do
kill_recurse $cpid
done
echo "killing $1"
kill -9 $1
}
사용 예는 다음과 같습니다.kill_recurse <my_parent_pid>