'ps'와 'kill'을 사용한 리눅스 프로세스 관리 이해 가이드
`ps`로 Linux 프로세스를 검사하고, 주요 열을 읽는 방법, 그리고 `kill`, `pkill`, `killall`로 프로세스를 안전하게 중지하는 방법을 알아보세요.
'ps'와 'kill'을 사용한 Linux 프로세스 관리 이해 가이드
Linux 프로세스 관리는 일상적인 문제 해결 기술입니다. 앱이 멈추거나, 백업 작업이 CPU를 많이 사용하거나, 데몬을 깔끔하게 재시작해야 할 때 ps는 프로세스를 찾는 데 도움을 주고 kill은 올바른 신호를 보낼 수 있게 해줍니다.
실행 중인 모든 프로그램에는 프로세스 ID(PID)가 있습니다. PID를 알면 소유권, 부모 프로세스, CPU 및 메모리 사용량을 검사하고, 프로세스에 정리 종료를 요청할지 아니면 최후의 수단으로 강제 종료할지 결정할 수 있습니다.
Linux 프로세스 모델: PID와 상태
Linux에서는 실행 중인 모든 프로그램, 서비스 또는 작업이 프로세스로 처리됩니다. 각 프로세스는 커널이 생성 시 할당하는 양의 정수인 **프로세스 ID(PID)**로 고유하게 식별됩니다. 이 PID는 시스템 도구가 특정 프로세스를 참조하고 조작하는 기본적인 방법입니다.
프로세스는 실행(running), 슬립(sleeping), 중지(stopped), 좀비(zombie)와 같은 상태를 거칩니다. 슬립 상태의 프로세스는 일반적으로 I/O 또는 다른 이벤트를 기다리고 있습니다. 좀비는 이미 종료되었지만 부모 프로세스가 종료 상태를 수집하지 않은 상태입니다.
ps 명령어로 프로세스 보기
ps(프로세스 상태) 명령어는 현재 실행 중인 프로세스에 대한 정보를 표시하는 데 사용됩니다. 출력이 방대할 수 있기 때문에 표시할 프로세스와 포함할 정보 열을 선택하기 위해 다양한 옵션이 사용됩니다.
필수 ps 문법 및 플래그
ps 플래그에는 Unix 스타일(- 접두사)과 BSD 스타일(접두사 없음)의 두 가지 주요 스타일이 있습니다. 현대적인 관행은 포괄적인 보기를 위해 Unix 스타일 플래그를 결합하는 것을 선호합니다.
1. 모든 프로세스 보기 (BSD 스타일)
시스템 개요를 위한 가장 일반적인 명령어는 ps aux입니다.
a: 모든 사용자의 프로세스를 표시합니다.u: 사용자 중심 형식(사용자, CPU 사용량, 메모리 사용량 등 표시)으로 프로세스를 표시합니다.x: 제어 터미널이 없는 프로세스(백그라운드 데몬 등)를 포함합니다.
ps aux
2. 표준 형식으로 프로세스 보기 (UNIX 스타일)
ps -ef 명령어는 POSIX 스타일 형식의 전체 목록을 제공합니다.
-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프로세스 자체를 표시합니다. 대괄호 표기법을 사용하면 추가 일치를 피할 수 있습니다:ps aux | grep '[h]ttpd'
kill 명령어로 프로세스 관리하기
kill 명령어는 단순히 프로세스를 중지시키는 것이 아니라 프로세스에 시그널을 보냅니다. 기본 동작은 정상 종료를 요청하는 것이지만, 다른 시그널은 프로세스가 설정 파일을 다시 읽거나, 실행을 일시 중지하거나, 강제로 즉시 종료하도록 지시할 수 있습니다.
시그널 이해하기
시그널은 표준화된 숫자 또는 니모닉 코드입니다. kill -l을 사용하여 사용 가능한 시그널을 나열할 수 있습니다.
| 시그널 이름 | 시그널 번호 | 설명 |
|---|---|---|
| SIGTERM | 15 | 기본 종료 시그널입니다. 프로세스에 정상적으로 종료하도록 요청합니다. |
| SIGKILL | 9 | 즉각적이고 강제적인 종료 시그널입니다. 프로세스가 이 시그널을 무시할 수 없습니다. |
| SIGHUP | 1 | 행업 시그널로, 데몬이 설정 파일을 다시 읽는 데 자주 사용됩니다. |
| SIGSTOP | 일반적으로 x86 Linux에서 19 | 프로세스를 종료하지 않고 중지(일시 중지)합니다. |
| SIGCONT | 일반적으로 x86 Linux에서 18 | 중지된 프로세스를 재개합니다. |
kill로 시그널 보내기
kill 명령어의 기본 문법은 다음과 같습니다:
kill -SIGNAL PID
1. 정상 종료 (최선의 방법)
먼저 SIGTERM을 시도하세요. 이는 애플리케이션에 상태 저장, 파일 닫기, 요청 완료, 잠금 해제 기회를 제공합니다.
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 <프로세스_이름>을 사용하여 프로세스 PID를 찾고 상태를 확인합니다. - 상태 확인:
STAT열을 검사합니다.Z이면 프로세스가 이미 죽은 것입니다. 부모 프로세스가 이를 수거해야 합니다. 무엇이든 종료하기 전에PPID를 확인하세요. - 정상 종료 시도:
SIGTERM(기본kill PID)을 보냅니다. 몇 초 기다립니다. - 종료 확인:
ps를 다시 실행합니다. - 필요시 강제 종료: 프로세스가 지속되고 위험을 이해했다면
kill -9 PID로SIGKILL을 보냅니다.
실용적인 습관은 간단합니다: PID를 식별하고, 소유자와 상태를 확인하고, 가장 온화한 유용한 시그널을 보낸 다음 결과를 확인하세요. 이렇게 하면 프로세스 정리가 예측 가능해지고 잘못된 작업을 중지할 가능성이 줄어듭니다.