본문 바로가기
C.W.K.
Stream
Lesson 03 of 10 · published

종료: 시그널 전송

~10 min · kill, signals, term

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

종료는 이름이 잘못됨

kill은 프로세스를 직접 없애는 명령이 아니라 신호를 보내. 기본 신호인 SIGTERM은 종료를 요청하며 프로그램이 핸들러를 두었다면 정리할 시간을 가질 수 있어. SIGKILL은 프로세스가 가로채거나 무시할 수 없으므로 운영체제가 즉시 중단해.

쓰게 될 시그널

  • kill PID: 기본값은 SIGTERM이야. 프로그램에 종료를 요청해.
  • kill -INT PID: SIGINT. Ctrl+C와 동일.
  • kill -HUP PID: SIGHUP. 많은 데몬이 '재시작 없이 설정 다시 불러오기' 신호로 처리.
  • kill -USR1 PID: 앱 정의. nginx가 로그 rotation 신호로 사용.
  • kill -KILL PID 또는 kill -9 PID: SIGKILL. 강제 종료, 정리 없음. 최후의 수단.
  • kill -STOP PID / -CONT: 일시정지 / 재개 (Ctrl+Z + fg와 유사).

이름으로 종료

pkill firefox
pkill -f 'python myscript.py'        # 전체 명령줄과 일치
killall Slack                          # macOS GUI 앱

단계적으로 종료 강도를 높여

  1. kill PID: 먼저 SIGTERM으로 정상 종료를 요청해.
  2. 5~10초 기다려. SIGTERM을 처리하는 프로그램이라면 이 안에 종료할 수 있어.
  3. kill -KILL PID: SIGTERM 무시했을 때만.

처음부터 -9를 쓰면 프로그램은 버퍼를 비우거나 임시 상태를 정리할 기회를 잃어. 먼저 SIGTERM을 보내고 상태 변화를 확인해. 그래도 멈추지 않고 영향이 계속되는 프로세스에 한해 SIGKILL을 마지막 수단으로 써.

신호를 보냈다고 끝난 것은 아니야

kill이 성공했다는 것은 커널이 요청을 받아들였다는 뜻이지 프로세스가 이미 종료됐다는 뜻은 아니야. SIGTERM 핸들러가 정리를 오래 할 수도 있고, 권한이 없으면 신호 자체가 거부될 수 있어. kill -0 PID와 서비스 상태, 로그를 함께 확인해.

프로세스 하나와 서비스 하나는 달라

감시 프로세스가 자식을 다시 띄우는 구조에서는 PID 하나를 종료해도 서비스가 복구돼. 장애를 멈추려면 launchd, systemd, 컨테이너 오케스트레이터처럼 생명주기를 소유한 층에서 중지해야 해. ‘무엇을 죽일까’보다 ‘누가 다시 살리는가’를 먼저 찾는 편이 빨라.

Code

정중 → 강제·bash
PID=$(pgrep -f myserver | head -1)
kill $PID                  # SIGTERM 전송
sleep 5
if kill -0 $PID 2>/dev/null; then
  echo 'still alive — escalating'
  kill -9 $PID
fi

External links

Exercise

터미널 A에서 sleep 999를 실행하고 터미널 B에서 pgrep -fa 'sleep 999'로 정확한 PID를 찾은 뒤 기본 kill로 정상 종료해. 같은 실험을 다시 만들고 SIGKILL을 사용했을 때 터미널 A의 보고와 정리 기회가 어떻게 달라지는지 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.