| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- mkdir
- 권한상승
- command
- nohup
- 커널패닉
- 명령어
- 리눅스
- 턱스
- pkill
- xargs
- IT
- sed
- Linux
- 스트림에디터
- du
- 상대경로
- 텍스트
- su
- disown
- 심볼릭링크
- 코드블럭
- chown
- printworkingdirectory
- 하드링크
- bg
- 모니터링
- CodeBlock
- pwd
- Tux
- remove
- Today
- Total
Snow flake
[command] ps, kill 명령어 본문
리눅스 서버를 운영하다 보면 "지금 이 시스템에서 뭐가 돌아가고 있는지" 확인하고, 문제가 생긴 프로세스를 강제로 종료해야 하는 상황이 자주 생깁니다. 이때 사용하는 명령어가 바로 ps와 kill입니다. 두 명령어는 항상 세트로 움직인다고 봐도 될 만큼 서로 이어지는 작업이라, 이번 글에서 함께 다뤄보겠습니다.
ps (Process Status)
ps는 Process Status의 약자로, 현재 시스템에서 실행 중인 프로세스 목록과 상태를 보여주는 명령어입니다.
# 사용법
ps [옵션]
# 현재 터미널에서 실행 중인 프로세스만 보기
ps
# 결과 예시
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:00 ps
옵션 없이 ps만 입력하면 현재 세션에서 실행 중인 프로세스만 간단히 보여줍니다. 하지만 실무에서는 시스템 전체 프로세스를 봐야 하는 경우가 대부분이라, 아래 옵션들을 훨씬 자주 사용합니다.
ps 주요옵션
# -e 또는 -A : 시스템에 실행 중인 모든 프로세스 표시
ps -e
ps -A
# -f : 상세 정보(전체 명령어, 부모 PID 등) 포함
ps -f
# -ef : 모든 프로세스를 상세 정보와 함께 표시 (실무에서 가장 많이 쓰는 조합)
ps -ef
# -u [사용자명] : 특정 사용자가 실행한 프로세스만 표시
ps -u oracle
ps -ef 조합은 사실상 리눅스 프로세스 확인의 표준처럼 쓰입니다. 결과에는 PID(프로세스 번호), PPID(부모 프로세스 번호), 실행 시각, 실행된 전체 명령어까지 나와서 어떤 프로세스가 왜 떠있는지 파악하기 좋습니다.
# ps -ef 결과 예시
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:00 ? 00:00:03 /sbin/init
oracle 2345 1 0 09:05 ? 00:00:12 ora_pmon_ORCL
oracle 2401 1 0 09:05 ? 00:00:05 ora_smon_ORCL
여기서 두 번째 컬럼(PID)이 바로 이후 kill 명령어에 넘겨줄 값입니다.
grep과 조합해서 원하는 프로세스만 찾기
프로세스가 수십~수백 개씩 떠있는 서버에서는, 원하는 프로세스만 걸러서 보는 게 필수입니다.
# 특정 이름이 포함된 프로세스만 확인
ps -ef | grep httpd
# 특정 사용자가 실행 중인 프로세스만 확인
ps -ef | grep oracle
# 여러 조건 동시에 필터링
ps -ef | grep oracle | grep pmon
이렇게 ps -ef | grep [키워드] 형태는 실무에서 정말 자주 쓰는 패턴입니다. grep 글에서도 다뤘듯이, ps의 방대한 출력 결과를 grep으로 좁혀서 확인하는 흐름입니다.
kill (프로세스 종료)
kill은 특정 프로세스에게 신호(signal)를 보내서 종료시키는 명령어입니다. ps로 찾은 PID를 대상으로 사용합니다.
# 사용법
kill [옵션] [PID]
# PID 2345 프로세스를 정상적으로 종료 요청
kill 2345
# 여러 프로세스를 한 번에 종료
kill 2345 2401 2456
kill만 입력하면 기본적으로 SIGTERM(15번) 신호를 보내서, 해당 프로세스가 스스로 정리 작업을 마치고 종료하도록 요청합니다.
kill 신호(signal) 종류
# -9 또는 -SIGKILL : 강제 종료 (프로세스가 응답 없을 때 사용)
kill -9 2345
# -15 또는 -SIGTERM : 정상 종료 요청 (기본값)
kill -15 2345
# -1 또는 -SIGHUP : 설정 재로드 (재시작 없이 설정만 다시 읽음)
kill -1 2345
# 신호 목록 전체 확인
kill -l
kill 2345와 kill -9 2345는 확실히 구분해서 써야 합니다. -15(기본값)는 프로세스에게 "정상적으로 종료해줘"라고 요청하는 것이라, 프로세스가 진행 중인 작업을 마무리하고 자원을 정리한 뒤 종료됩니다. 반면 -9는 프로세스에게 어떤 정리 시간도 주지 않고 즉시 강제 종료시킵니다.
kill -9는 최후의 수단으로
# 1단계: 정상 종료 시도
kill 2345
# 몇 초 기다려도 프로세스가 살아있으면 확인
ps -ef | grep 2345
# 2단계: 그래도 안 죽으면 강제 종료
kill -9 2345
kill -9를 처음부터 습관적으로 쓰는 경우가 많은데, 이는 권장되지 않습니다. 프로세스가 파일을 쓰고 있거나 트랜잭션을 처리하는 중이었다면, 강제 종료로 인해 데이터 손상이나 임시 파일이 그대로 남는 문제가 생길 수 있습니다. 먼저 kill(기본 SIGTERM)로 정상 종료를 시도하고, 일정 시간이 지나도 종료되지 않을 때만 -9를 사용하는 순서가 안전합니다.
pkill로 이름 기반 종료하기
PID를 일일이 찾기 번거로울 때는 pkill을 사용하면 프로세스 이름만으로 바로 종료할 수 있습니다.
# 사용법
pkill [프로세스명]
# httpd라는 이름이 포함된 모든 프로세스 종료
pkill httpd
# 특정 사용자가 실행한 프로세스 전부 종료
pkill -u oracle
pkill은 내부적으로 ps로 찾고 kill을 실행하는 과정을 한 번에 처리해주는 명령어라고 이해하면 됩니다. 다만 이름 기반이라 의도치 않은 다른 프로세스까지 같이 종료될 위험이 있으니, 정확한 이름을 확인한 후 사용하는 게 안전합니다.
실무에서 자주 마주치는 상황
서비스가 응답하지 않을 때, 프로세스를 확인하고 재시작하는 흐름은 다음과 같이 진행되는 경우가 많습니다.
# 1단계: 문제가 의심되는 서비스 프로세스 확인
ps -ef | grep listener
# 2단계: PID 확인 후 정상 종료 시도
kill 3456
# 3단계: 종료 확인
ps -ef | grep 3456
# 4단계: 그래도 남아있으면 강제 종료
kill -9 3456
# 5단계: 서비스 재기동
lsnrctl start
이렇게 "확인 → 정상 종료 → 재확인 → 필요 시 강제 종료" 순서로 접근하는 습관을 들여두면, 운영 중인 서버에서 예상치 못한 부작용 없이 안전하게 프로세스를 다룰 수 있습니다. 특히 DB나 인프라 운영 업무에서는 프로세스 하나를 잘못 강제 종료했다가 데이터 정합성 문제로 이어지는 경우도 있어서, ps로 정확히 확인하고 신중하게 kill 하는 습관이 중요합니다.
'Programming > Linux' 카테고리의 다른 글
| [command] tar, gzip 명령어 (1) | 2026.09.13 |
|---|---|
| [command] df, du 명령어 (0) | 2026.09.12 |
| [command] find 명령어 (0) | 2026.09.10 |
| [command] grep 명령어 (0) | 2026.09.09 |
| [command] su, sudo 명령어 (0) | 2026.09.08 |
