Linux 프로세스 관리 이해하기: 'ps'와 'kill' 명령어 활용법
프로세스를 관리하는 것은 효과적인 Linux 시스템 관리의 기본입니다. 애플리케이션이 응답하지 않거나, 과도한 리소스를 소비하거나, 정상적으로 다시 시작해야 할 때, 해당 프로세스를 식별하고 상호 작용하는 방법을 아는 것이 중요합니다. 이 가이드는 Linux 프로세스 관리의 핵심인 프로세스 상태를 확인하는 ps 명령어와 프로세스 생명주기를 관리하기 위해 신호를 보내는 kill 명령어에 대한 포괄적인 소개를 제공합니다.
Linux가 실행 중인 프로그램(각각 고유한 프로세스 ID(PID) 할당)을 어떻게 처리하는지 이해하면 관리자는 시스템 안정성을 유지하고, 성능 병목 현상을 해결하며, 서비스가 예상대로 작동하도록 보장할 수 있습니다. 이 가이드에서는 모든 시스템 관리자의 도구 상자에서 필수적인 도구가 되는 명령어의 기본 구문과 일반적인 플래그를 탐구할 것입니다.
Linux 프로세스 모델: PID 및 상태
Linux에서 실행 중인 모든 프로그램, 서비스 또는 작업은 프로세스로 취급됩니다. 각 프로세스는 커널이 생성 시 할당하는 양의 정수인 프로세스 ID (PID)로 고유하게 식별됩니다. 이 PID는 시스템 도구가 특정 프로세스를 참조하고 조작하는 주요 방법입니다.
프로세스는 다양한 상태(예: 실행 중, 대기 중, 중지됨, 좀비)를 거칩니다. 상태를 알면 문제 해결 단계를 즉시 파악하는 데 도움이 됩니다.
ps 명령어로 프로세스 보기
ps (프로세스 상태) 명령어는 현재 실행 중인 프로세스에 대한 정보를 표시하는 데 사용됩니다. 출력 결과가 너무 많을 수 있으므로, 어떤 프로세스를 표시할지, 어떤 정보 열을 포함할지를 선택하기 위해 다양한 옵션이 사용됩니다.
필수 ps 구문 및 플래그
ps 플래그에는 두 가지 주요 스타일이 있습니다: Unix 스타일 (접두사 -) 및 BSD 스타일 (접두사 없음). 현대적인 방식은 포괄적인 보기를 위해 Unix 스타일 플래그를 결합하는 것을 선호하는 경우가 많습니다.
1. 모든 프로세스 보기 (BSD 스타일)
시스템 개요를 위한 가장 일반적인 명령어는 ps aux입니다.
a: 모든 사용자의 프로세스를 표시합니다.u: 사용자 중심 형식으로 프로세스를 표시합니다 (사용자, CPU 사용량, 메모리 사용량 등을 표시).x: 제어 터미널이 없는 프로세스(백그라운드 데몬 등)를 포함합니다.
ps aux
2. 표준 형식으로 프로세스 보기 (UNIX 스타일)
ps -ef 명령어는 이전 형식이지만 여전히 널리 사용되는 형식으로 전체 목록을 제공합니다.
-e: 모든 프로세스를 선택합니다.-f: 전체 형식 목록을 표시합니다 (PPID 및 명령 인수 포함).
ps -ef
주요 출력 열 해석
사용된 플래그에 관계없이 특정 열은 프로세스 관리에서 중요합니다:
| 열 | 설명 |
|---|---|
| PID | 프로세스 ID (고유 식별자) |
| PPID | 부모 프로세스 ID (이 프로세스를 시작한 프로세스의 PID) |
| USER | 프로세스를 소유한 사용자 |
| %CPU | 사용된 CPU 시간 비율 |
| %MEM | 사용된 물리적 메모리 비율 |
| VSZ | 가상 메모리 크기 (KiB 단위) |
| RSS | 상주 집합 크기 (사용된 물리적 메모리, KiB 단위) |
| STAT | 프로세스의 현재 상태 (예: R=실행 중, S=대기 중, Z=좀비) |
| COMMAND | 프로세스를 시작한 명령어 |
grep으로 프로세스 필터링
특정 프로세스를 찾으려면 ps의 출력을 grep으로 파이프하는 것이 일반적인 방법입니다.
예시: Apache 웹 서버(httpd)의 모든 실행 중인 인스턴스 찾기:
ps aux | grep httpd
팁:
ps | grep을 사용할 때, 출력에grep명령어 자체가 표시되는 경우가 많습니다. 이를 필터링하려면 검색 패턴에 대괄호 표기법을 사용하십시오:
bash ps aux | grep '[h]ttpd'
kill 명령어로 프로세스 관리하기
kill 명령어는 단순히 프로세스를 중지시키는 것이 아니라 신호를 보냅니다. 기본 동작은 정상적인 종료를 요청하는 것이지만, 다른 신호를 통해 프로세스가 구성 파일을 다시 읽거나, 실행을 일시 중지하거나, 즉시 종료하도록 지시할 수 있습니다.
신호 이해하기
신호는 표준화된 숫자 또는 니모닉 코드입니다. kill -l을 사용하여 사용 가능한 신호를 나열할 수 있습니다.
| 신호 이름 | 신호 번호 | 설명 |
|---|---|---|
| SIGTERM | 15 | 기본 종료 신호입니다. 프로세스에게 정상적으로 종료하도록 요청합니다. |
| SIGKILL | 9 | 즉각적이고 강제적인 종료 신호입니다. 프로세스는 이 신호를 무시할 수 없습니다. |
| SIGHUP | 1 | Hangup 신호로, 종종 데몬이 구성 파일을 다시 읽는 데 사용됩니다. |
| SIGSTOP | 19 | 프로세스를 종료하지 않고 중지(일시 중지)합니다. |
| SIGCONT | 18 | 중지된 프로세스를 다시 시작합니다. |
kill로 신호 보내기
kill 명령어의 기본 구문은 다음과 같습니다:
kill -SIGNAL PID
1. 정상 종료 (최선의 방법)
항상 먼저 SIGTERM (신호 15)을 사용하여 프로세스를 정상적으로 종료하십시오. 이렇게 하면 애플리케이션이 데이터를 저장하고 연결을 닫을 시간을 갖게 됩니다.
kill 12345 # SIGTERM (15)으로 기본 설정
# 또는
kill -15 12345
2. 강제 종료 (최후의 수단)
프로세스가 응답하지 않고 SIGTERM을 무시하는 경우, SIGKILL (신호 9)을 사용하십시오. 이렇게 하면 정리 작업 없이 프로세스가 즉시 중지되므로 일부 애플리케이션에서는 데이터 손실이나 손상이 발생할 수 있습니다.
kill -9 12345
이름으로 프로세스 관리: pkill 및 killall
ps와 kill은 PID에 의존하지만, 때로는 이름으로 프로세스를 타겟팅하는 것이 더 빠릅니다. 이 명령어는 여러 프로세스에 동시에 영향을 미칠 수 있으므로 극도의 주의를 기울여 사용하십시오.
killall
제공된 정확한 프로세스 이름과 일치하는 모든 프로세스를 종료합니다.
killall httpd # 'httpd'라는 이름의 모든 프로세스에 SIGTERM을 보냅니다.
killall -9 cron # 모든 'cron' 프로세스를 강제로 종료합니다.
pkill
killall보다 더 많은 유연성을 제공하며, 신호를 보낼 프로세스를 선택할 때 패턴 매칭(정규 표현식)을 허용합니다.
# 명령어 이름에 'firefox'가 포함된 모든 프로세스를 종료합니다.
pkill -f firefox
killall및pkill에 대한 경고: 실수로 중요한 시스템 프로세스(init또는systemd등)를 타겟팅하면 전체 운영 체제가 불안정해지거나 충돌할 수 있습니다.killall또는pkill을 광범위한 패턴으로 사용하기 전에 항상ps를 사용하여 타겟 PID를 확인하십시오.
프로세스 관리 워크플로우 요약
실행 중인 애플리케이션 문제를 해결할 때 다음과 같은 체계적인 접근 방식을 따르십시오:
- 식별:
ps aux | grep <process_name>을 사용하여 프로세스 PID를 찾고 상태를 확인합니다. - 상태 확인:
STAT열을 검토합니다.Z(좀비)인 경우, 부모 프로세스가 비활성화되었으며 부모를 종료할 수 없는 경우 재부팅이 필요할 수 있습니다. - 정상 중지 시도:
SIGTERM(기본값kill PID)을 보냅니다. 몇 초간 기다립니다. - 중지 확인:
ps를 다시 실행합니다. - 강제 중지 (필요한 경우): 프로세스가 계속 실행되면
SIGKILL(kill -9 PID)을 보냅니다.
ps와 kill을 마스터하는 것은 건강하고 반응성이 좋은 Linux 환경을 유지하는 데 필수적입니다. PID와 사용 가능한 다양한 신호를 이해함으로써 관리자는 시스템 실행을 정밀하게 제어할 수 있습니다.