Views: 0
목차
kill 명령의 기본 이해
kill은 단순히 “죽인다”는 의미가 아니라, **프로세스에 시그널(signal)**을 보내는 명령이다. 시그널은 운영체제가 프로세스에 특정 동작을 요청하는 통신 방식이며, 종료, 일시정지, 재개 등 다양한 역할을 한다.
대표적인 시그널은 다음과 같다.
SIGTERM (15): 정상 종료 요청SIGKILL (9): 강제 종료SIGHUP (1): 재시작 신호SIGINT (2): Ctrl+C 입력과 동일
kill 명령 뒤에 번호나 시그널명을 지정하면 해당 신호를 보낼 수 있다.
kill -15 <PID> # 정상 종료 요청
kill -9 <PID> # 즉시 강제 종료
kill -9의 문제점
kill -9은 SIGKILL 시그널을 보내 즉시 프로세스를 종료시킨다. 이 신호는 프로세스가 무시하거나 처리할 수 없는 유일한 신호다. 즉, 프로세스에게 정리(clean-up)할 기회를 전혀 주지 않는다.
데이터 손상 위험
데이터를 파일로 쓰는 중에 kill -9을 보내면, 파일이 완전히 기록되지 않아 손상될 수 있다. 특히 데이터베이스 서버나 캐시 프로세스에 사용하면 트랜잭션이 중단되고 로그 불일치가 발생한다.
리소스 누수
kill -9으로 강제 종료된 프로세스는 열려 있던 파일 디스크립터, 소켓, 세마포어 등의 리소스를 정리하지 못한다. 커널이 나중에 정리하긴 하지만, 일시적으로 포트가 점유된 상태가 지속될 수 있다.
좀비 프로세스 발생
부모 프로세스가 종료된 자식 프로세스를 회수하지 못할 경우 좀비 프로세스가 남을 수 있다. SIGKILL은 종료 직후 리턴 코드나 상태 정보를 남기지 않기 때문에, 관리되지 않는 좀비가 생기기도 한다.
안전한 프로세스 종료 절차
프로세스를 종료할 때는 강제 종료보다 순차적 종료를 원칙으로 해야 한다. 아래는 실무에서 권장되는 단계별 절차다.
1단계: 정상 종료 시도
먼저 SIGTERM을 보내 정상적인 종료 루틴이 수행되도록 한다.
kill -15 <PID>
이 시그널은 프로세스에게 종료 요청을 전달하며, 프로세스는 내부적으로 열려 있던 자원이나 세션을 정리한 후 종료한다.
2단계: 응답이 없을 경우
일정 시간(예: 5~10초) 기다려도 종료되지 않으면, 프로세스가 멈춘 상태일 가능성이 있다. 이때는 SIGINT 또는 SIGHUP을 시도할 수 있다.
kill -2 <PID> # 사용자 인터럽트
kill -1 <PID> # 세션 재시작 신호
서비스에 따라 SIGHUP을 받으면 재로딩(reload)을 수행하는 경우도 많다. (예: nginx -s reload 명령과 동일한 효과)
3단계: 최후의 수단으로 강제 종료
정상적인 종료 신호에 전혀 반응하지 않을 때만 kill -9을 사용한다.
kill -9 <PID>
단, 데이터베이스나 시스템 핵심 프로세스에는 사용하지 않는 것이 좋다. 해당 프로세스의 상태가 불안정하다면 서비스 전체를 재기동하는 것이 더 안전하다.
프로세스 식별 및 점검 방법
PID 확인
현재 실행 중인 프로세스의 PID(Process ID)를 찾으려면 ps 또는 pgrep 명령을 사용한다.
ps aux | grep nginx
pgrep nginx
ps는 상세 정보(메모리, CPU 사용량)를 함께 보여주고, pgrep은 PID만 간결하게 출력한다.
프로세스 상태 점검
top이나 htop 명령으로 CPU, 메모리 점유율이 높은 프로세스를 실시간으로 모니터링할 수 있다.
정지 상태(T 상태)나 대기 중(D 상태)인 프로세스는 일반 시그널에 반응하지 않을 수 있으므로, 커널 I/O 대기 문제일 가능성을 먼저 점검해야 한다.
서비스 단위로 안전하게 종료하기
단일 프로세스에 직접 kill을 사용하는 대신, systemd 기반 환경이라면 systemctl을 이용하는 것이 좋다.
sudo systemctl stop nginx
sudo systemctl restart postgresql
이 방식은 서비스 내부의 종료 절차를 안전하게 수행하며, 관련 자원 정리까지 자동으로 처리한다.
서비스가 비정상 응답일 경우 systemctl kill --signal=TERM nginx처럼 특정 시그널을 지정해 단계적으로 종료할 수도 있다.
자동 복구 및 재시작 대비
서비스가 예기치 않게 종료되는 상황을 대비해 자동 재시작 설정을 병행하는 것이 좋다.systemd의 [Service] 섹션에 다음 옵션을 추가한다.
Restart=on-failure
RestartSec=5
이 설정은 비정상 종료 시 5초 후 자동으로 재시작하도록 한다. 수동으로 kill -9을 반복할 필요 없이 안정적인 복구가 가능하다.
마무리
kill -9은 편리하지만 위험한 명령이다. 프로세스가 종료 신호를 처리할 기회를 주지 않기 때문에, 데이터 손상과 시스템 불안정을 초래할 수 있다. 항상 SIGTERM → SIGINT → SIGKILL 순으로 안전하게 종료를 시도하고, 가능하다면 systemctl 명령이나 서비스 관리 도구를 통해 제어하는 것이 바람직하다. 이를 습관화하면 서버 안정성과 장애 대응 속도가 모두 향상된다.