ps 맨페이지에 명시된 대로STATUS 값이 "D"인 프로세스는 "중단되지 않는 절전 모드(일반적으로 IO)"를 의미합니다.
또한 다음 내용을 읽었습니다.여기서는 TASK_INTERRUPTIBLE을 사용해야 합니다. 그렇지 않으면 커널 스레드가 신호를 받을 수 없고 (1) 사용자 공간에서 스레드를 종료하거나 커널에서 kthread_stop()을 사용할 수 없습니다.
위의 내용이 충분하지 않은 경우 다음을 읽어보세요.D의 프로세스 상태(STAT)는 프로세스가 "무중단 절전" 상태에 있음을 나타냅니다. 실제 세계에서 이는 일반적으로 I/O를 기다리고 있으며 I/O 작업이 완료될 때까지 죽는 것을 포함하여 아무것도 할 수 없거나 하지 않을 것임을 의미합니다.
IO를 기다리는 프로세스를 실행한다고 가정해 보겠습니다.
[root@mpinode02 Distros]# find / -mmin +10 > /dev/null &
[1] 15592
그런 다음 상태와 프로세스를 살펴봅니다.
[root@mpinode02 Distros]# ps -C find -ostat,comm,wchan
STAT COMMAND WCHAN
D find sleep_on_buffer
자, 이 프로세스가 실제로 중단할 수 없는지 살펴보겠습니다.
[root@mpinode02 Distros]# kill 15592
[1]+ Terminated time find / -mmin +10 > /dev/null
보시다시피 현실 세계에서는 D가 포함된 프로세스가 종료됩니다. ps에 대한 매뉴얼 페이지는 오래된 것입니까?
실제로 새로운 상태가 있는 것을 확인했습니다. 임무는 죽일 수 있다하지만 어떻게 나열하는지 알고 싶습니다. 종료 가능한 작업을 나열하거나 식별하는 방법을 알고 있나요?
답변1
신호와 경쟁 조건이 있는 놀라운 세계에 오신 것을 환영합니다.
ps 명령을 여러 번 실행하면 명령을 실행할 때 D 상태가 아닌 경우가 종종 있습니다. find는 디스크를 기다리는 데 대부분의 시간을 소비하지만 디스크에서 모든 시간을 소비하지는 않습니다. 그렇지 않으면 킬 신호가 전달됩니다.
에프절대당신이 원하는 것을하십시오. ps는 모든 명령을 반복하여 해당 시점에 어떤 명령이 종료 가능한지 또는 불가능한지 알려줄 수 있습니다. 하지만 사람을 죽이기 시작하면 목록이 달라집니다. kill(음, kill을 의미하는 커널)이 즉시 신호를 보낼 수 없더라도 가능한 한 빨리 신호를 보냅니다. 따라서 "D" 상태도 "전혀 종료될 수 없음"을 의미하는 것이 아니라 "이 클럭 사이클에서 종료될 수 없음"을 의미합니다.