리눅스 서버에 프로그램을 설치하고 권한까지 맞춰두면 이제 모든 것이 순조롭게 돌아갈 것만 같습니다. 하지만 서버를 운영하다 보면 갑자기 키보드 입력이 뚝뚝 끊기거나, 웹사이트 접속이 무한 로딩에 걸리는 당황스러운 순간을 마주하게 됩니다. 눈에 보이는 화면이 없는 리눅스 터미널 환경에서는 도대체 어떤 녀석이 컴퓨터의 힘(CPU)과 메모리를 갉아먹고 있는지 파악하기가 쉽지 않습니다.
윈도우에서는 이럴 때 Ctrl + Shift + Esc를 눌러 '작업 관리자'를 켜고 범인 프로그램을 찾아 '작업 끝내기'를 누르면 그만입니다. 리눅스 터미널에서도 이와 똑같은 역할을 하는 명령어들이 존재합니다. 현재 살아 움직이는 프로그램들의 상태를 실시간으로 감시하고, 말썽을 부리는 프로세스를 강제로 종료하는 필수 명령어 3가지를 아주 쉽게 풀어드리겠습니다.
1. 현재 실행 중인 프로그램의 스냅샷: ps 명령어
리눅스에서는 실행 중인 모든 프로그램을 '프로세스(Process)'라고 부릅니다. 그리고 이 프로세스들은 저마다 사람의 주민등록번호 같은 고유한 번호를 부여받는데, 이를 'PID(Process ID)'라고 합니다. 리눅스에서 프로세스를 제어하려면 반드시 이 PID를 알아야 합니다.
현재 어떤 프로그램들이 돌고 있는지 사진을 찍듯 한순간의 목록을 보여주는 명령어가 바로 ps입니다. 하지만 그냥 ps만 입력하면 내가 지금 쓰고 있는 터미널 창의 아주 아주 기본적인 프로세스 몇 개만 달랑 보여줍니다. 그래서 실무에서는 시스템 전체의 모든 사용자가 돌리고 있는 프로세스를 샅샅이 찾아내기 위해 ps -ef 또는 ps aux라는 옵션을 붙여서 사용합니다.
이 명령어를 치면 화면에 수많은 줄이 내려오는데, 우리가 눈여겨봐야 할 것은 PID 열과 맨 오른쪽의 CMD(어떤 명령어로 실행되었는지) 열입니다. 만약 목록이 너무 길어 내가 원하는 프로그램을 찾기 어렵다면, 파이프 기호(|)와 검색 명령어를 조합해 ps -ef | grep nginx처럼 입력하면 nginx(웹서버)와 관련된 프로세스만 쏙 골라내어 PID를 확인할 수 있습니다.
2. 실시간으로 변하는 작업 관리자: top 명령어
ps가 멈춰있는 사진이라면, top 명령어는 실시간으로 움직이는 비디오와 같습니다. 터미널 창에 top을 입력하고 엔터를 치는 순간, 화면 전체가 실시간 작업 관리자 창으로 변신합니다. 화면이 계속 깜빡이며 3초마다 최신 정보로 업데이트됩니다.
top 화면의 맨 위를 보면 전체 CPU 사용량과 메모리(KiB Mem) 사용량이 숫자로 변하는 것을 볼 수 있습니다. 그 아래로는 현재 컴퓨터의 자원을 가장 많이 잡아먹고 있는 순서대로 프로세스들이 나열됩니다.
내가 처음 리눅스 서버를 운영할 때, 특정 스크립트 코드를 잘못 짜서 무한 루프에 빠진 적이 있었습니다. 서버가 먹통이 되었을 때 당황하지 않고 top을 켰더니, 특정 프로세스의 %CPU 수치가 100%를 찍고 있는 것을 발견할 수 있었습니다. 이렇게 원인을 직관적으로 진단할 수 있게 해주는 고마운 도구입니다. 실시간 모니터를 끝내고 다시 검은 터미널 화면으로 빠져나오고 싶다면 키보드에서 알파벳 [ q ]를 누르면 됩니다.
3. 말썽꾸러기 프로그램 사살하기: kill 명령어
범인을 찾았다면 이제 그 프로그램을 강제로 종료시켜 서버를 진정시켜야 합니다. 이때 사용하는 명령어가 바로 '죽이다'라는 뜻의 kill입니다. 사용법은 단순합니다. kill [종료할 프로세스의 PID] 형태로 입력하면 됩니다. 예를 들어 아까 ps나 top으로 확인한 범인 프로그램의 PID 번호가 1234라면, kill 1234라고 입력하는 것이죠.
하지만 종종 프로세스가 완전히 얼어붙어 버려서 일반적인 kill 명령어를 내려도 컴퓨터의 말을 무시하고 계속 좀비처럼 버티는 경우가 있습니다. 이때는 시스템에게 "이유 불문하고 지금 당장 강제로 사살해"라는 명령을 내려야 합니다.
그것이 바로 악명 높은 kill -9 [PID] 명령어입니다. -9라는 옵션은 리눅스 커널(시스템의 최하층 뇌)에 직접 신호를 보내 프로세스를 즉시 강제 종료시키는 가장 강력한 무기입니다. 왠만한 먹통 프로세스는 kill -9 한 방으로 전부 정리가 됩니다.
프로세스를 죽일 때 초보자가 절대 하지 말아야 할 실수
kill -9 명령어가 워낙 강력하고 확실하다 보니, 초보 시절에는 프로그램이 조금만 느려져도 무조건 -9 옵션을 붙여서 죽이는 나쁜 습관이 생기곤 합니다. 하지만 이 강제 종료는 프로그램이 하던 작업(데이터베이스에 글을 쓰거나 파일을 저장하는 과정)을 완전히 무시하고 코드를 뽑아버리는 것과 같습니다. 이로 인해 파일이 깨지거나 데이터가 유실되는 2차 피해가 발생할 수 있습니다.
따라서 프로세스를 정리할 때는 항상 단계적인 절차를 밟아야 합니다. 먼저 옵션 없이 kill PID를 보내 프로그램이 스스로 하던 일을 정리하고 안전하게 닫히도록 유도(우아한 종료)해야 합니다. 그렇게 몇 초를 기다렸는데도 도저히 반응이 없을 때, 최후의 수단으로 kill -9를 꺼내 드는 것이 현명합니다.
또한, PID 번호를 오타 내서 시스템의 필수 프로세스(예: 로그인 관리자 등)를 죽여버리면 서버 자체가 다운될 수 있으므로, kill 명령어를 치기 전에는 내가 타겟팅한 PID가 맞는지 다시 한 번 눈으로 검증하는 침착함이 필요합니다.
👉 핵심 요약
ps -ef명령어를 사용하면 현재 서버에서 돌고 있는 모든 프로그램의 고유 번호인 PID를 스냅샷 형태로 조회할 수 있습니다.top명령어는 윈도우의 작업 관리자처럼 실시간으로 CPU와 메모리 점유율을 모니터링하며,q를 눌러 종료합니다.문제가 되는 프로세스는
kill [PID]로 안전하게 종료할 수 있으며, 완전히 멈춘 좀비 프로세스는kill -9 [PID]로 강제 종료합니다.강제 종료(
-9)는 데이터 유실을 초래할 수 있으므로 항상 일반kill을 먼저 시도한 뒤 최후의 수단으로 사용해야 안전합니다.
💢다음 편 예고
서버에서 움직이는 프로그램들을 감시하고 통제하는 법까지 마스터하셨으니, 이제 서버 운영의 꽃이라고 할 수 있는 네트워크 영역으로 들어갈 준비가 되었습니다. 다음 글에서는 내 서버에 외부 사용자가 잘 들어오고 있는지, 특정 포트가 열려 있는지 확인하는 '네트워크 상태 점검의 기본: ping, netstat, ss 명령어 활용법'을 아주 쉽게 다루어 보겠습니다.
실습 도중 프로그램이 멈추거나 컴퓨터가 느려져서 당황했던 적이 있으신가요? top 명령어를 입력했을 때 가장 높은 CPU를 차지하고 있던 프로그램은 무엇이었는지 댓글로 경험담을 들려주세요!
0 댓글