리눅스 프로세스 모니터링 필수 명령어 ps와 top 및 kill 종료 방법

리눅스(Linux)나 우분투(Ubuntu) 환경에서 웹 서버를 운영하다 보면 배포한 애플리케이션이 응답하지 않거나, CPU 사용량이 100%를 찍으며 서버 전체가 무겁게 버벅거리는 장애 상황을 종종 겪게 됩니다. 마치 윈도우 컴퓨터에서 프로그램이 멈췄을 때 ‘작업 관리자’를 켜서 원인을 찾고 강제 종료를 하는 것처럼, 리눅스 서버에서도 현재 메모리 위에서 돌고 있는 실시간 프로세스들을 점검하고 제어할 줄 알아야 합니다.

CUI(텍스트 기반) 환경인 리눅스 터미널에서는 마우스 클릭 대신 강력한 명령어들을 조합하여 시스템 상태를 조회합니다. 본 가이드에서는 내 서버의 자원을 과도하게 갉아먹는 ‘범인 프로세스’를 찾아내기 위한 필수 명령어인 ps와 top의 실무 활용법을 알아보고, 문제가 되는 프로세스를 안전하게 강제 종료하는 kill 명령어의 시그널 체계까지 상세히 정리합니다.

1. 특정 시점의 프로세스 스냅샷 확인: ps 명령어

ps 명령어는 ‘Process Status’의 줄임말로, 명령어를 입력한 그 순간에 시스템에서 실행 중인 프로세스들의 정적인 스냅샷(현재 상태)을 보여주는 도구입니다.

실무에서 무조건 외우는 마법의 옵션: ps aux

단순히 ps만 입력하면 현재 내가 열어놓은 터미널 세션 안에서 실행된 아주 제한적인 프로세스만 보여주므로 무용지물에 가깝습니다. 시스템 전체 유저가 돌리고 있는 백그라운드 데몬까지 싹 다 긁어모아 확인하려면 항상 aux 옵션을 붙여서 실행해야 합니다.

Bash

ps aux

각 옵션 알파벳이 가지는 의미는 다음과 같습니다.

  • a: 터미널과 연동된 모든 사용자의 프로세스를 출력합니다.
  • u: 프로세스 소유자의 이름, CPU 및 메모리 사용량 등 상세 정보를 친절하게 보여줍니다.
  • x: 터미널과 연결되지 않은 프로세스(시스템 백그라운드에서 상주하는 데몬 프로그램 등)까지 포함하여 출력합니다.

실무 팁: 파이프라인(|)과 grep 매칭 활용하기

ps aux를 치면 수백 줄의 프로세스가 화면을 덮쳐 내가 원하는 프로그램을 찾기 어렵습니다. 이때 리눅스의 파이프 구문과 패턴 매칭 명령어인 grep을 연결하면 내가 원하는 특정 프로세스만 쏙 골라낼 수 있습니다. 예를 들어 현재 내 서버에 Nginx 웹 서버가 몇 개나 돌고 있는지 확인하고 싶다면 아래와 같이 입력합니다.

Bash

ps aux | grep nginx

이 명령어를 통해 화면에 출력되는 두 번째 열의 숫자가 바로 해당 프로세스의 고유 번호인 PID(Process ID)입니다. 이 PID는 추후 프로세스를 제어하거나 종료할 때 식별표 역할을 하는 매우 중요한 정보입니다.

2. 윈도우 작업 관리자처럼 실시간 자원 추적: top 명령어

ps 명령어가 멈춰있는 사진을 찍는 것이라면, top 명령어는 시스템 자원 사용량을 실시간으로 계속 업데이트하며 보여주는 ‘동영상 영상’과 같습니다. 서버의 CPU나 메모리 부하 원인을 실시간으로 모니터링할 때 반드시 실행해야 하는 명령어입니다.

Bash

top

top 화면을 실행하면 터미널 창 전체가 시스템 대시보드로 변하며 3초마다 정보가 갱신됩니다. 화면 맨 상단에는 서버의 가동 시간(uptime), 로그인된 유저 수, 시스템 부하 평균치(Load Average)가 표시되며, 그 아래로 CPU 사용률(%CPU)과 메모리 점유율(%MEM)이 가장 높은 프로세스들이 내림차순으로 줄을 서서 나타납니다.

top 실행 중 유용한 인터랙티브 단축키

top이 켜진 상태에서 키보드의 특정 알파벳을 누르면 화면의 정렬 방식을 실시간으로 바꿀 수 있어 매우 편리합니다.

  • M: 프로세스 목록을 메모리(RAM) 사용량이 높은 순서로 즉시 재정렬합니다. 메모리 누수가 의심되는 프로그램을 잡을 때 유용합니다.
  • P: 프로세스 목록을 CPU 사용량이 높은 순서로 즉시 재정렬합니다. (기본값)
  • u: 특정 사용자의 프로세스만 필터링해서 볼 수 있게 해줍니다. 키를 누른 후 유저명(예: ubuntu)을 입력하면 됩니다.
  • q: 실시간 모니터링 화면을 안전하게 종료하고 일반 리눅스 터미널 프롬프트로 복귀합니다.

3. 좀비 및 에러 프로세스 강제 종료: kill 명령어

pstop을 통해 시스템을 좀먹고 있거나 무한 루프에 빠져 응답하지 않는 문제 프로세스의 PID를 찾아냈다면, 이제 이를 강제로 종료하여 서버 자원을 회복시켜야 합니다. 이때 사용하는 명령어가 바로 kill입니다.

많은 초보자가 kill이 무조건 프로세스를 파괴하는 명령어라고 생각하지만, 실제로는 프로세스에게 특정 시그널(Signal, 신호)을 보내는 명령어입니다. 프로세스는 수신한 시그널의 종류에 따라 다르게 반응합니다.

실무에서 사용하는 2대 핵심 kill 시그널

  • -15 (SIGTERM / 안전 종료 요청 – 기본값): 프로세스에게 “이제 작업을 정리하고 안전하게 정상 종료해 주겠니?”라고 정중하게 요청하는 신호입니다. 프로세스는 이 신호를 받으면 하던 저장 작업을 마무리하고, 메모리를 반환한 뒤 깔끔하게 물러납니다. 시스템 안정성을 위해 가장 먼저 시도해야 하는 정석 명령어입니다.

Bash

kill -15 [프로세스_PID]
  • -9 (SIGKILL / 강제 종료 처리): 프로세스의 의사나 상태를 깡그리 무시하고 리눅스 커널(OS) 단에서 해당 프로세스를 즉시 강제로 격추하여 소멸시키는 강력한 신호입니다. 프로그램이 완전히 꼬여서 -15 신호조차 먹지 않는 데드락(Deadlock) 상태나 먹통 상태일 때 마지막 수단으로 사용합니다.

Bash

sudo kill -9 [프로세스_PID]

강제 종료 시그널인 -9는 파일 쓰기 작업 중이던 데이터가 손상될 위험이 있으므로, 가급적 일반 종료 시그널을 먼저 찔러본 뒤 반응이 없을 때 최종 병기로 꺼내 드는 것이 안전한 인프라 관리 습관입니다. 또한 시스템 중요 프로세스를 건드릴 수 있으므로 대개 앞에 sudo 권한을 붙여 실행합니다.

결론: 안정적인 인프라 유지를 위한 프로세스 거버넌스

리눅스 서버에서 프로세스를 모니터링하고 제어하는 능력을 갖추는 것은 인프라 엔지니어와 서버 관리자에게 있어서 자동차의 보닛을 열고 내부 엔진을 점검하는 것과 같습니다.

장애가 발생했을 때 당황하여 서버 컴퓨터를 통째로 강제 리부팅하는 거친 방식 대신, topps aux | grep으로 부하의 원인이 되는 정확한 프로세스 ID를 식별해 내고, kill -15-9 시그널 체계로 우아하게 도려내는 정밀 타격식 트래픽 트래블슈팅을 생활화해 보시기 바랍니다. 이러한 꼼꼼한 모니터링 분석 버릇이 대규모 상용 서비스에서도 흔들리지 않는 단단하고 안정적인 리눅스 인프라를 유지하는 최고의 밑거름이 될 것입니다.

댓글 남기기