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경우 쉘일 수 있음 (보통 POSIX 쉘에 있음) 또는 독립 실행형 명령을 실행하는 프로세스). pid 1의 프로세스.killkill

이 작업은 시스템 호출의 일부로 수행되므로 프로세스를 먼저 나열한 다음 프로세스를 놓칠 수 있으므로 종료하는 또는 같은 명령 (또는 Linux에서 전통적으로 사용되는 전통적인 명령 ) kill()을 사용하는 것보다 더 안정적입니다. 그동안 생성된 프로세스입니다.pkillkillallkillallkillall5

그래서 정확히 당신이 원하는 것 같습니다.

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가 1인 별도의 pid 및 마운트 네임스페이스(새로운 /proc( ps/ pkill/ 에서 사용됨) 사용)에서 쉘이 시작됩니다.killall

Linux 외부에서는 kill -- -1대부분의 프로세스를 종료할 때 모든 시스템에서 작동해야 하지만 종료에서 제외되는 프로세스 목록은 시스템마다 다를 수 있습니다.

답변2

할 수 있다너? 예. 해야 한다너? 거의 모든 상황에서 그렇지 않습니다. 하지만:

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

관련 정보