우분투 실전 명령어 | ps, grep, pgrep으로 프로세스 추적/필터링
언제 쓰는가
서버가 느려졌는데 어떤 프로세스가 CPU를 잡아먹는지 빨리 찾아야 할 때 가장 먼저 쓰는 조합입니다. ps로 전체 상태를 보고, grep으로 원하는 패턴만 좁히고, PID만 필요하면 pgrep으로 바로 뽑아 후속 명령에 연결하면 됩니다. 장애 대응에서 "원인 프로세스 찾기 → 확인 → 종료/재시작" 흐름을 짧게 만들 때 특히 유용합니다.
바로 쓰는 명령어
# 1) 현재 프로세스 전체 확인
ps aux --sort=-%cpu | head -n 15
# 2) 특정 프로세스 문자열 검색
ps aux | grep -i nginx
# 3) grep 자기 자신 제외
ps aux | grep -i '[n]ginx'
# 4) 이름으로 PID만 추출
pgrep nginx
# 5) 전체 명령줄 기준으로 매칭
pgrep -af "gunicorn|uvicorn"
# 6) PID를 바로 상세 확인
ps -fp "$(pgrep -n nginx)"
# 실무 패턴: 찾아서 즉시 검증
PID=$(pgrep -n python3)
ps -fp "$PID"
# 오래된 순/최신 순 PID 찾기
pgrep -o sshd # oldest
pgrep -n sshd # newest
자주 하는 실수
ps aux | grep nginx결과에서grep nginx줄을 진짜 nginx로 착각하는 경우가 많습니다.grep '[n]ginx'또는pgrep을 쓰면 헷갈림을 줄일 수 있습니다.pgrep python처럼 패턴을 너무 짧게 주면 의도하지 않은 프로세스까지 같이 잡힙니다. 서비스명이나 실행파일명을 더 구체적으로 넣는 게 안전합니다.pgrep기본 매칭은 프로세스 이름(comm) 기준이라, 명령줄 전체에서 찾아야 할 때는-f를 빼먹지 않아야 합니다.
검증 방법
# 후보 PID 목록 확인
pgrep -af nginx
# 특정 PID 상태/시작시간/명령줄 확인
ps -fp 12345
# 실제 리소스 점유 확인
ps -p 12345 -o pid,ppid,%cpu,%mem,etime,cmd
확인 포인트는 단순합니다. (1) PID가 맞는지, (2) 기대한 실행 경로/옵션인지, (3) CPU/메모리/실행시간이 이상 징후를 보이는지 세 가지만 보면 됩니다.
실행 결과 예시
$ ps aux --sort=-%cpu | head -n 5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
www-data 8421 72.3 3.1 325000 64012 ? Rl 19:01 12:43 /usr/bin/python3 app.py
mysql 1320 18.5 12.8 1892340 262900 ? Ssl 10:22 156:01 /usr/sbin/mysqld
root 911 4.2 0.3 72000 7040 ? Ss 10:20 8:11 /usr/sbin/sshd -D
$ pgrep -af "gunicorn|uvicorn"
8421 /usr/bin/python3 -m uvicorn main:app --host 0.0.0.0 --port 8000
$ ps -fp 8421
UID PID PPID C STIME TTY TIME CMD
www-data 8421 8409 73 19:01 ? 00:12:43 /usr/bin/python3 app.py
출처
- Ubuntu Manpages
- procps-ng Manual
- GNU Grep Manual