PID 1을 제외한 모든 프로세스를 종료하는 방법은 무엇입니까?

PID 1을 제외한 모든 프로세스를 종료하는 방법은 무엇입니까?

PID 1을 제외한 시스템의 모든 프로세스를 종료하고 싶습니다.

나는 현재 pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT.

awkPID 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

할 수 있는너? 예. ~해야 한다너? 거의 모든 경우에 그렇지 않습니다. 하지만:

initLinux에서는 SIGTERM을 명시적으로 무시합니다. 그래서 당신은 간단하게 이것을 할 수 있습니다 killall -TERM '*'.

관련 정보