우분투 실전 명령어 | 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