서버 상태 확인하고 멈춘 프로그램 끄기
현재 서버에서 실행 중인 프로그램을 확인하고 문제가 생긴 프로세스를 강제로 종료하는 ps, top, kill 명령어 사용법을 알아봅니다.
우리가 스마트폰을 쓰다가 앱이 먹통이 되면, 최근 앱 목록을 열어서 해당 앱을 위로 튕겨 올려 강제 종료합니다. 리눅스 기반 웹 서버를 운영하다 보면 바이브코딩으로 만든 프로그램이 무한 루프에 빠져 서버 자원을 모두 갉아먹거나 멈춰버리는 일이 자주 발생합니다. 터미널 환경에서는 마우스로 앱을 위로 튕겨서 끌 수가 없습니다. 이번 시간에는 서버 안에서 현재 어떤 프로그램들이 실행 중인지 상태를 진단하고, 문제가 생긴 프로그램을 깔끔하게 강제 종료하는 방법을 배웁니다.
실행 중인 프로그램, 프로세스(Process)와 PID
우리가 만든 코드가 디스크에 저장되어 있을 때는 그냥 정적인 '파일'에 불과하지만, 이 코드를 실행시켜서 메모리에 올라가 작동하기 시작하면 그것을 프로세스(Process)라고 부릅니다. 서버 안에서는 수십, 수백 개의 프로세스가 동시에 각자의 일을 하며 돌아가고 있습니다.
리눅스는 실행 중인 모든 프로세스에 주민등록번호처럼 고유한 식별 번호를 부여하여 관리합니다. 이를 PID (Process ID)라고 부릅니다. 만약 말썽을 일으키는 프로그램이 있다면, 이름이 아니라 이 고유한 PID 번호를 알아내어 저격해야만 안전하게 종료할 수 있습니다.
서버의 현재 상태를 스캔하는 레이더: `ps`와 `top`
현재 서버 안에서 무슨 일이 벌어지고 있는지, 어떤 프로그램들이 살아 숨 쉬고 있는지 확인하려면 어떻게 해야 할까요? 대표적으로 `ps`와 `top` 명령어를 사용합니다.
`ps`는 Process Status의 약자로, 명령어를 입력한 그 순간 찰나의 프로세스 목록을 정적인 사진처럼 찍어서 보여줍니다. 리눅스 관리자들은 모든 사용자의 프로세스를 상세하게 보기 위해 습관적으로 `ps aux`라는 옵션 조합을 사용합니다.
ps aux와 grep의 콤보 활용
만약 현재 `node`라는 웹 서버 프로그램이 실행 중인지, 그리고 그 PID 번호가 무엇인지 찾고 싶다면 앞에서 배운 `grep` 명령어와 파이프(`|`) 기호를 결합합니다. 파이프 기호는 앞 명령어의 결과를 뒤 명령어의 입력으로 넘겨주는 훌륭한 다리 역할을 합니다.
$ ps aux | grep node
meshops 14235 0.1 2.5 1204856 50200 ? Sl 10:00 0:02 node server.js결과에 나온 `14235`라는 숫자가 바로 이 노드 프로그램의 고유한 PID 번호입니다.
사진 한 장으로 부족하고, 윈도우의 '작업 관리자'처럼 1초마다 실시간으로 변하는 프로세스들의 자원 사용량(CPU, 메모리)을 영상처럼 지켜보고 싶을 때는 `top` 명령어를 칩니다. 서버가 갑자기 느려졌을 때 `top`을 켜보면 어떤 프로세스가 CPU를 100% 잡아먹고 있는지 맨 위에서 실시간으로 범인을 색출할 수 있습니다. (`top` 화면에서 빠져나올 때는 `q`를 누릅니다.)
서버의 아파트 호수: 포트(Port)의 이해
웹 서버를 운영하다 보면 "Error: Port 8080 is already in use (8080 포트가 이미 사용 중입니다)" 라는 악명 높은 에러를 마주치게 됩니다. 바이브코딩으로 코드를 수정하고 서버를 다시 켰는데, 예전에 켜둔 서버가 아직 죽지 않고 자리를 차지하고 있어서 발생하는 문제입니다.
서버가 하나의 거대한 아파트(IP 주소)라면, 포트(Port)는 그 아파트의 각 집을 가리키는 '호수'입니다.
- 80호: 일반 웹사이트 요청을 받는 문
- 443호: 보안 인증이 된 웹사이트 요청을 받는 문
- 22호: 관리자가 SSH로 원격 접속하기 위한 문
하나의 호수(포트)에는 단 하나의 프로그램(프로세스)만 살 수 있습니다. 내가 만든 코드를 8080 포트에서 실행하려는데 다른 유령 프로세스가 이미 8080호를 차지하고 있다면, 그 유령 프로세스의 PID를 알아내어 방을 빼도록 만들어야 합니다.
무자비한 사형 선고: `kill` 명령어
원인을 제공한 말썽쟁이 프로세스의 PID를 알아냈다면, 이제 강제로 종료시킬 차례입니다. 이때 사용하는 명령어가 아주 직관적인 이름의 `kill` 입니다.
사용법은 `kill [PID번호]` 입니다. 아까 `ps` 명령어로 찾은 번호가 14235였다면, `kill 14235`라고 입력합니다. 이는 프로세스에게 "하던 일을 정리하고 정상적으로 종료해 줘"라고 정중하게 요청하는 것입니다.
하지만 멈춰버린 프로그램은 이 정중한 요청마저 무시할 때가 많습니다. 그럴 때는 무조건 즉시 사살하라는 최후의 통첩 옵션인 `-9`를 함께 사용합니다.
kill 명령어 사용 시 주의사항
오해 또는 실수
권한 확인 부족
바로잡기
남이 실행한 프로세스나, 시스템 핵심 프로세스를 죽이려면 반드시 앞에 sudo를 붙여야 합니다. (예: sudo kill -9 14235)
오해 또는 실수
엉뚱한 PID 입력
바로잡기
PID 번호를 오타 내서 시스템이 유지하는 데 필요한 아주 중요한 데이터베이스를 죽여버리면 대형 사고가 납니다. 한 번 더 번호를 확인하세요.
오해 또는 실수
항상 -9부터 쓰는 습관
바로잡기
옵션 없이 kill을 먼저 시도하여 프로세스가 데이터를 안전하게 저장할 기회를 주고, 그래도 안 죽을 때만 -9 옵션을 쓰는 것이 안전합니다.
프로세스와 포트의 개념을 이해하고, 내 코드가 살아있는지 확인(`ps`)하고 죽이는(`kill`) 감각을 익히는 것은 서버를 통제하기 위한 가장 기본적이면서도 중요한 기술입니다. 당황하지 않고 프로세스를 재시작할 수 있다면 더 이상 서버 멈춤 현상을 두려워할 필요가 없습니다.
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.서버에서 실행 중인 파이썬(python) 프로그램의 고유 식별 번호(PID)를 알아내기 위해, 수많은 프로세스 목록 중에서 파이썬 관련 줄만 뽑아서 보려고 합니다. 가장 적절한 명령어 조합은 무엇인가요?
3줄 요약
- 1디스크에 있는 프로그램이 실행되어 메모리에 올라가면 프로세스가 되며, 각 프로세스는 고유한 식별 번호인 PID를 가집니다.
- 2ps aux 명령어와 grep을 결합하여 특정 프로세스의 존재 여부와 PID를 찾아낼 수 있고, top 명령어로 실시간 자원 사용량을 진단합니다.
- 3동일한 포트를 두 프로그램이 점유할 수 없어 에러가 발생할 때, 기존 프로세스의 PID를 찾아 kill -9 명령어로 강제 종료하여 문제를 해결합니다.