"죽일" 것인지` 올바른 제거 순서를 찾으십니까(또는 올바른 재시도가 이루어졌습니까)?

"죽일" 것인지` 올바른 제거 순서를 찾으십니까(또는 올바른 재시도가 이루어졌습니까)?

kill <PID list>일부 프로세스는 다른 프로세스보다 먼저 종료될 수 없으므로 그러한 프로세스를 종료하려고 시도하고 포기한 다음 해당 "파트너"를 성공적으로 종료하여 이전 프로세스도 종료될 수 있음에도 불구하고 종료되지 않은 채로 남겨두는 상황을 생각할 수 있습니다. 나중에 다시 시도해 보세요.

이것이 사실이라면 또 다른 질문은 kill <PID list>목록에 있는 PID의 순서가 존중되는지입니다. 아니면 프로세스가 종료되는 순서를 제어하기 위해 별도의 종료 프로세스를 사용해야 합니까?

답변1

각 대상에게 차례로 신호를 보내는 것보다 더 많은 것이 있는지 의심됩니다.POSIX는 kill(1)다음과 같이 정의됩니다., 따라서 재시도는 사양을 위반하는 것 같습니다.

이것죽이다유틸리티는 지정된 각 프로세스에 신호를 보내야 합니다.PID피연산자.

각각PID피연산자,죽이다유틸리티 회사는 다음과 같은 조치를 취해야 합니다.죽이다() 기능

SIGHUP또한 모든 신호로 인해 프로세스가 종료되는 것은 아니며 일부 신호 (예: 언급하지 않음 SIGUSR1)는 프로그램마다 다른 의미를 가질 수 있다는 점을 명심하십시오 . 재시도 시기를 알 수 있는 명확한 방법은 없지만 먼저 보낸 다음 를 사용하는 kill방법은 있습니다 .SIGTERMSIGKILL

주어진 순서로 신호를 보내는 것은 구현하기 간단합니다. 이것이 Bash가 kill하는 일입니다:

$ strace -etrace=kill bash -c 'kill -0 33330 33339 33335 33332 33337' |& grep ^'kill('
kill(33330, SIG_0)                      = -1 ESRCH (No such process)
kill(33339, SIG_0)                      = -1 ESRCH (No such process)
kill(33335, SIG_0)                      = -1 ESRCH (No such process)
kill(33332, SIG_0)                      = -1 ESRCH (No such process)
kill(33337, SIG_0)                      = -1 ESRCH (No such process)

답변2

kill <PID list>지정된 프로세스 목록에 지정된 신호를 보냅니다. 그런 다음 시스템의 동작은 특정 프로세스가 해당 특정 신호를 무시하는지 여부에 따라 달라집니다. 기본적으로 killTERM 신호가 전송됩니다.

여기서 SIGKILL에 대해 이야기하고 있다고 가정하면 신호를 차단하거나 무시할 수 없습니다. 따라서 나열된 프로세스는 kill -9어떤 이유로든 응답하지 않는 한(예: 차단된 NFS에서 I/O를 기다리는 경우) 종료됩니다.

답변3

우리는 간단히 살펴보면 이 질문에 답할 수 있습니다.kill.c.

기본적으로 우리는:

  • struct proc_processes를 사용하여 모든 프로세스 나열ps = proc_open_processes(); 그런 다음 해당 목록을 pid 또는 프로세스 이름으로 필터링하여 보냅니다.

  • 발견된 각 프로세스에 대해 kill_verbose(&ctl)를 수행하십시오. 쉽습니다. 죽이기(ctl->pid, ctl->numsig)

SIGKILL에 의해 프로세스가 종료되면 종료됩니다. ~에서신호.h:

terminate   - kill the process, i.e. all threads in the group,
      similar to exit_group.  The group leader (only) reports
      WIFSIGNALED status to its parent.

보시다시피 이는 단순한 "처리할 메시지 보내기" 명령일 뿐입니다. 멋진 것은 없습니다.

관련 정보