defunct 프로세스란?
(Zombie) 프로세스라고도 함
프로세스가 자식을 만들면 부모(parent) 프로세스는 자식(children) 프로세스의 실행이 끝날 때까지 기다렸다가 자식 프로세스의 실행이 끝난 후에 다시 자신의 실행을 계속한다. 사용자가 터미널에서 명령어를 실행하면 쉘이 이와 같은 원리로 작동한다. 자식의 실행이 완료되면 커널이 그 사실을 인지하여 부모에게 시그널 18, 즉 자식의 죽음을 전송한다. 그러나 & 지시자를 사용하여 백그라운드로 프로세스를 실행하는 경우는 이와 다르다. 이 경우는 쉘이 자식의 실행이 완료되기를 기다리지 않으며 백그라운드 프로세스의 부모가 되지도 않는다.
죽은 자식의 부모가 어떤 작업을 하고 있으면 자식의 죽음을 알지 못한다. 따라서 이때는 자식이 정상적으로 죽을 수 없게 된다. 시스템은 그런 자식 프로세스들을 zombie 또는 defunct 상태로 만든다. 이 프로세스들을 실제로 죽은 것도 아니고 현재 실행 중이거나 CPU 시간을 사용하고 있는 것도 아닌 상태에 있는 것이다. 부모가 자식의 죽음을 인지하고 나면 defunct 프로세스는 시스템에서 없어진다.
ps를 실행시키면 가끔 COMMAND 항에 <defunct> 또는 <exciting>라고 표시된 프로세스를 볼 수 있다. 이 defunct 프로세스가 한 두 시간씩 시스템에 남아 있고 시간이 지날수록 이런 프로세스가 많아지면 문제가 된다. 이것은 프로세스들의 죽음을 부모 프로세스가 인지하지 못해서 발생하는 현상이기 때문에 이런 경우는 부모 프로세스에 문제가 있는 것이다. 부모 프로세스가 블럭 상태에 있어 자식의 죽음을 인지하지 못하는 경우가 대부분이다. 이 경우, 부모 프로세스를 kill 명령어로 죽여야 이 문제가 해결된다. 또 defunct 프로세스는 부모 프로세스는 죽었는데 자식 프로세스가 살아 있을 때 생겨나게 된다. 이 경우, defunct 프로세스는 kill 명령어를 사용하여 죽일 수 없으므로 시스템 관리자에게 연락하여 적절한 조치를 취해야 한다.
【예제】
% man telnet
..............한 화면 나타남...................
^z
% ps
PID TT STAT TIME COMMAND
140 p0 S 0:00 -csh(csh)
145 p0 T 0:00 man telnet
151 p0 T 0:00 sh -c more -s /tmp/man145
152 p0 T 0:00 more -s /tmp/man145
154 p0 R 0:00 ps
% kill 152
sh: 152 Terminated
% ps
PID TT STAT TIME COMMAND
140 p0 S 0:00 -csh(csh)
145 p0 TW 0:00 man telnet
151 p0 Z 0:00
156 p0 R 0:00 ps
현재 작동중인 모든 프로세스를 보는 명령이 ps -ef이다. 자신이 시스템 관리자라면, 오래 동안 사용하지 않은 상태로 남아 있는 ID가 있을 경우에 사용자를 없앨 수 있는 방법으로 해당 프로세스를 알기 위하여 ps -ef를 실행하면 오래 동안 휴면상태에 있는 ID의 프로세스의 번호를 찾아 kill, pkill, stop명령으로 삭제할 수 있다.
또한 실행이 매우 느리고 폭주 프로세스이거나 그 프로세서 몫 이상으로 이용하는지 의심스러우면 이 작업을 수행한다. 그리고 많은 CPU 시간을 소비하는 프로세스를 찾으면, 그 프로세스를 없애는 편이 좋을 것이다.
【예제】
% ps -ef
UID PID PPID C STIME TTY TIME COMD
............많은 프로세스가 나열 됨 ..................
jijoe 1470 1468 44 16:44:03 pts/0 0:00 -csh
joe 1550 1548 42 17:08:48 pts/1 0:00 -csh
% kill 1548
% ps -ef
............많은 프로세스가 나열 됨 ..................
UID PID PPID C STIME TTY TIME COMD
jijoe 1470 1468 44 16:44:03 pts/0 0:00 -csh
%
Viewing, Terminating, and Scheduling Process
현재 동작중인 프로세스에 관한 정보를 보여주는 명령은 다음과 같다.
• ps
• prstat
• pgrep
또한 현재 진행중인 프로세스를 종료하는 명령어는 다음과 같다.
• kill
• killall
• pkill
• stop
그리고 Scheduling process 명령어는 다음과 같다.
• cron
• at
'IT > 리눅스마스터1급' 카테고리의 다른 글
리눅스 기본 명령어 (0) | 2022.05.09 |
---|---|
iptables 설정 및 옵션 (0) | 2022.05.09 |
vmstat (0) | 2022.05.09 |
ulimit (0) | 2022.05.09 |
du -c -h (0) | 2022.05.09 |