kill -TERM -PID
PID와 모든 하위 프로세스를 종료해야 합니다.
그러나 이것은 openSUSE에서는 작동하지 않습니다. 어떤 PID를 사용하든 항상 그러한 프로세스 PID가 없다고 알려줍니다.
따라서 이 특정 버전의 kill이 음수 PID 옵션을 지원하지 않는 경우 프로세스 그룹을 종료하는 가장 좋은 방법은 무엇입니까?
배경:
쉘 스크립트를 실행 중입니다. 스크립트에서는 wget을 사용하여 물건을 다운로드합니다. 따라서 script는 상위 프로세스이고 wget은 하위 프로세스입니다. kill -TERM -PID_OF_SCRIPT를 사용하여 죽이고 싶습니다.
답변1
"해당 PID 없음"이라고 표시되어 있습니까? 아니면 오류가 있습니까? - 작동합니까?
kill -TERM -- -GPID
또한 (강조 내)에 따라
남자 1:
"[...] '-n' 형식의 인수가 제공되면 이는 다음을 나타내기 위한 것입니다.프로세스 그룹[…]”
남자 2:
"[...] pid가 -1보다 작으면 프로세스의 모든 프로세스에 sig가 전송됩니다.ID가 -pid인 프로세스 그룹입니다.[…]”
남자 3:
"[...] pid가 음수이지만 -1이 아닌 경우 sig는 다음을 수행하는 모든 프로세스(지정되지 않은 시스템 프로세스 세트 제외)로 전송됩니다.프로세스 그룹 IDpid의 절대값과 같습니다. […]”
예를 들어 PID가 아니라 프로세스 그룹 ID입니다.
그렇지 않으면 재미있게 놀 수 있을 것 같아요/proc/[pid]/stat
ppid: awk '{gsub(/\([^)]+\)/,"_"); print $4}' /proc/3955/stat
pgrp: awk '{gsub(/\([^)]+\)/,"_"); print $5}' /proc/3955/stat
pkill -TERM -g PGRP
답변2
오류 메시지는 /bin/kill: -23958: No such process
pid로 인해 발생할 수도 있습니다 23958
.아니요pgid (프로세스 그룹 ID 번호)!
예를 들어 스크립트에서 실수로 pgid로 사용된 백그라운드 셸(또는 명령)을 종료하려고 하면 $!
이런 일이 발생할 수 있습니다 . 그러나 작업 제어가 활성화된 셸에서는 $!
pgid로 사용할 수 있습니다(참조:Linux에서 상위 프로세스가 종료된 후에도 하위 프로세스가 여전히 살아 있는 이유는 무엇입니까?).
# examples of how to kill a process group
# (using sh -c '...' instead of a shell script)
# kill: -<num>: No such process
sh -c '
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
'
# in Terminal.app
# job control is enabled by default
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
# enable job control
sh -c '
set -m
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
'
# make sure pid == pgid
# note that the script gets killed as well
sh -c '
echo pid $$
trap "trap - EXIT; echo pid $$ was killed" EXIT
(sleep 200 & sleep 200 & sleep 200) &
IFS=" " read -r pgid <<EOF
$(ps -p $! -o pgid=)
EOF
sleep 5
/bin/kill -s TERM -${pgid}
sleep 5
echo pid $$ was not killed
'
# use a pseudo-terminal (pty) to avoid killing the script
# note the use of -$$ instead of -$!
sh -c '
echo pid $$
script -q /dev/null sh -c '\''
trap "" HUP
(sleep 200 & sleep 200 & sleep 200) &
sleep 5
/bin/kill -s TERM -$$
'\''
sleep 5
echo pid $$ was not killed
'
답변3
다른 StackExchange 사이트의 이 스레드에 표시된 대로 "pkill" 또는 "killtree" 솔루션을 사용할 수 있습니다. :)
https://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes
pkill -TERM -P PARENT_PID
답변4
기본 운영 체제에서 Busybox를 사용하는 경우, 말하자면 Error: kill: bad signal name '-'
이것이 문제일 가능성이 높습니다 --
.
kill -TERM -- -[gpid]
기본 신호인 TERM 뿐만 아니라 지정해야 합니다 kill -- -[gpid]
.
이유는 모르겠습니다.