PID 1을 제외한 시스템의 모든 프로세스를 종료하고 싶습니다.
나는 현재 pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT
.
awk
PID 1이 있는 프로세스를 제외하는 데 사용됩니다.
알파인 리눅스(사용)에서 명령을 실행하면 다음과 같은 결과를 sh
얻습니다.
# pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT
kill: can't kill pid 265: No such process
PID 256
나는 그것이 에서 비롯된 것이라고 믿습니다 awk
.
을 제외한 모든 프로세스를 종료하는 깔끔한 방법(대부분의 Linux 시스템에서 사용 가능한 유틸리티 사용)이 있습니까 PID 1
?
답변1
적어도 리눅스에서는
kill -- -1
SIGTERM 신호는 호출 프로세스를 제외한 모든 프로세스에 전송되며(따라서 kill
명령을 실행하는 프로세스는 kill
내장 쉘(보통 POSIX 쉘에 있음)이거나 kill
독립형 명령을 실행하는 프로세스일 수 있음) pid는 1입니다.
이 작업은 kill()
시스템 호출의 일부로 수행되므로 동시에 생성된 프로세스를 놓치기 때문에 먼저 프로세스를 나열한 다음 종료하는 pkill
또는 같은 명령 killall
(또는 Linux에서 killall
때때로 사용되는 기존 명령)을 사용하는 것보다 더 안정적입니다.killall5
이것은 정확히 당신이 원하는 것 같습니다.
trap '' TERM # ignore SIGTERM ourselves though it wouldn't be needed
# in most shells
kill -- -1
sleep 1 # leave processes some time to exit cleanly on SIGTERM
kill -s KILL -- -1 # removes the remaining processes or those
# that have started since without giving them
# a chance to clean-up.
exit
ID가 1인 프로세스를 제외한 모든 프로세스가 종료되어야 합니다.
다음 명령을 실행하여 실험해 볼 수 있습니다.
unshare --mount-proc -mpf
이는 별도의 pid 및 mount 네임스페이스(새 /proc(/에서 사용) 사용 ) ps
에서 pid 1로 쉘을 시작합니다 pkill
.killall
Linux 외부에서는 kill -- -1
대부분의 프로세스를 종료하는 모든 시스템에서 작동하지만 종료에서 제외되는 프로세스 목록은 시스템마다 다를 수 있습니다.
답변2
할 수 있는너? 예. ~해야 한다너? 거의 모든 경우에 그렇지 않습니다. 하지만:
init
Linux에서는 SIGTERM을 명시적으로 무시합니다. 그래서 당신은 간단하게 이것을 할 수 있습니다 killall -TERM '*'
.