[Linux] 좀비 프로세스 <defunct> 죽이기 간단 정리!

jaylnne·2022년 5월 6일
1

Linux

목록 보기
1/2

👿 이슈 상황 

GPU에 올린 train 작업을 종료하기 위해 nvidia-smi에서 확인된 PID 를 kill 했다. 그런데 해당 프로세스에 묶인 GPU 메모리가 free 되지 않는다. 모델과 데이터가 여전히 디바이스에 올라가 있다는 뜻이다. 종료한 PID는 분명 더이상 nvidia-smi에는 실행중인 것으로 표시되지 않는다.

어떻게 된 일일까?

1) 원인

  • 부모 프로세스가 여전히 죽지 않았기 때문.
  • 부모 프로세스가 죽지 않으면, 자식 프로세스는 kill 해도 죽지 않고 좀비 프로세스()가 된다.

왜 부모-자식 프로세스로 실행되었나?

  • train 작업을 python 파일을 실행시키지 않고 sh 파일로 실행했기 때문.
  • train.sh 이 부모 프로세스, train.sh 실행으로 인한 python train.py 가 자식 프로세스
$ ./train.sh

# train.sh 스크립트 내용은 아래
# python train.py

2) 해결

좀비 프로세스의 부모 프로세스를 찾아 죽이자! 🪓

  • 좀비 프로세스 찾기
ps -ef | grep defunct | grep -v grep

# out
[root@server ~]# ps -ef | grep defunct | grep -v grep
jaylnne 21207 21205  0 Feb26 ?        00:00:00 [my_script.sh] <defunct>
  • 좀비 프로세스 PID(21207)와 부모 프로세스 PID(21205) 확인
  • 부모 프로세스 죽이기
kill -9 21205
  • 해결! ✨

Tip❗  부모 프로세스의 부모 프로세스(조부모 프로세스)가 있는 경우도 있다. 자식 프로세스를 죽이는 것이 목적이라면 조부모 프로세스까지 죽일 필요는 없다. 부모 프로세스만 죽이면 좀비가 된 자식 프로세스를 완전히 죽일 수 있다.

profile
스스로 정한 목표에 도달하기 위해 달리는 걸 즐기는 사람 🏃‍♀️

0개의 댓글