pgrep 명령어 사용법

이름이나 사용자 등 조건에 맞는 프로세스의 PID를 찾아 출력하는 명령어입니다.

프로세스·작업관리연결 실습 문제 3개Rocky Linux 8 기준 · 실행 결과는 실습 컨테이너에서 확인

기본 문법

pgrep [옵션] 패턴

pgrep은 실행 중인 프로세스 목록에서 이름이나 소유자 등의 조건에 맞는 프로세스를 골라 PID를 출력하는 명령어입니다. procps-ng 패키지에 포함되어 있으며 Rocky Linux 8에도 기본 설치되어 있습니다. 기본적으로 인자로 준 문자열을 프로세스 이름에 대한 확장 정규표현식으로 취급해 부분 일치하는 프로세스를 모두 찾습니다.

`ps -ef | grep 이름` 형태로도 PID를 찾을 수 있지만, 이 방식은 grep 프로세스 자신이 결과에 섞이고 불필요한 열까지 함께 출력됩니다. pgrep은 PID만 출력하므로 `kill $(pgrep 이름)`처럼 다른 명령의 입력으로 연결하기 좋습니다. 같은 이름의 프로세스가 여러 개 떠 있을 때 -o(가장 오래된), -n(가장 최근) 옵션으로 하나만 고르는 것도 자주 쓰이는 용법입니다.

실무에서는 서비스 프로세스의 생존 확인, 스크립트 중복 실행 방지, 특정 사용자 소유 프로세스 확인 등에 사용합니다. 리눅스마스터·LPIC 시험에서는 pkill, kill, renice와 함께 프로세스 식별 및 종료·우선순위 변경 문제의 앞 단계로 출제됩니다.

자주 쓰는 옵션

옵션의미
-lPID와 함께 프로세스 이름도 출력pgrep -l sleep
-aPID와 전체 명령행(인자 포함)을 출력pgrep -a sleep
-f프로세스 이름이 아닌 전체 명령행을 대상으로 매칭pgrep -f "sleep 300"
-x부분 일치가 아닌 이름이 정확히 일치하는 것만 검색pgrep -x sleep
-o조건에 맞는 프로세스 중 가장 오래된 것 하나만 출력pgrep -o -x worker_loop
-n조건에 맞는 프로세스 중 가장 최근에 시작된 것 하나만 출력pgrep -n sleep
-u 사용자지정한 유효 사용자(EUID) 소유의 프로세스만 검색. 실제 사용자(RUID) 기준으로 찾으려면 -U를 사용pgrep -u root sshd
-c일치하는 프로세스의 개수만 출력pgrep -c sleep
-v조건에 일치하지 않는 프로세스를 출력(반전)pgrep -v -u root
-d 구분자여러 PID를 출력할 때 줄바꿈 대신 지정한 구분자로 연결pgrep -d, sleep

실무 예시

이름으로 PID 찾기

준비: mkdir -p /tmp/demo; sleep 300 &

$ pgrep sleep
1
21

이름에 sleep이 포함된 프로세스의 PID를 한 줄에 하나씩 출력합니다. grep과 달리 검색 명령 자신은 결과에 나오지 않습니다. 이미 실행 중이던 sleep 프로세스도 함께 잡히므로, 아래 출력의 PID 1은 실습 환경에 먼저 떠 있던 sleep입니다.

PID와 명령행 함께 보기

준비: sleep 400 &

$ pgrep -a sleep
1 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 600
21 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 300
28 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 400

-a는 PID와 함께 실행된 전체 명령행을 보여 주므로, 같은 이름의 프로세스를 인자로 구분할 때 유용합니다. 실습 환경의 sleep은 coreutils 멀티콜 바이너리로 실행되어 명령행에 /usr/bin/coreutils가 앞에 붙어 나옵니다.

전체 명령행으로 정확히 찾기

준비: sleep 500 &

$ pgrep -f "sleep 500"
35

-f를 쓰면 프로세스 이름뿐 아니라 인자까지 포함한 명령행 전체에서 패턴을 찾습니다. 인자가 다른 동일 이름 프로세스를 구분할 수 있습니다.

가장 오래된 프로세스 하나만 고르기

준비: cp /bin/sleep /tmp/demo/worker_loop; /tmp/demo/worker_loop 300 & sleep 1; /tmp/demo/worker_loop 300 &

$ pgrep -o -x worker_loop
43

-o는 조건에 맞는 프로세스 중 가장 먼저 시작된 것 하나의 PID만 출력합니다. -x로 이름 전체 일치를 강제해 오탐을 줄입니다.

찾은 PID로 바로 종료하기

준비: cp /bin/sleep /tmp/demo/worker_watchdog; /tmp/demo/worker_watchdog 300 &

$ kill $(pgrep -x worker_watchdog); sleep 1; pgrep -c -x worker_watchdog; echo "exit=$?"
bash: line 2:    53 Terminated              /tmp/demo/worker_watchdog 300
0
exit=1

pgrep 결과를 kill의 인자로 넘겨 이름 기준으로 프로세스를 종료합니다. 이후 -c로 남은 개수를 확인하는데, 일치하는 프로세스가 없으면 pgrep은 0을 출력하면서 종료 코드 1을 반환합니다. 앞선 초안은 이 종료 코드 1이 그대로 명령 전체의 결과가 되어 실패처럼 보였으므로, echo로 종료 코드를 확인하도록 고쳤습니다. 대화형 셸에서는 잡 제어 메시지(Terminated)가 함께 출력될 수 있습니다.

주의할 점

  • 패턴은 부분 일치 정규표현식입니다. worker가 worker_loop까지 잡으므로 정확히 지정하려면 -x를 쓰세요.
  • 기본 검색 대상은 프로세스 이름(최대 15자)입니다. 인자로 구분하려면 -f를 함께 써야 합니다.
  • 일치하는 프로세스가 없으면 아무것도 출력하지 않고 종료 코드 1을 반환합니다. 이때 `kill $(pgrep ...)`는 인자 없이 실행되어 오류가 나므로, 결과가 비었는지 먼저 확인하세요.
  • -u는 유효 사용자(EUID) 기준입니다. 실제 사용자 기준으로 찾으려면 -U를 사용하세요.
  • -f는 pgrep 자신은 제외하지만 상위 셸이나 다른 스크립트의 명령행이 걸릴 수 있습니다. 종료 명령과 연결하기 전에 pgrep 결과만 먼저 확인하세요.
  • 넓은 패턴에 kill이나 pkill을 바로 연결하면 의도하지 않은 프로세스까지 종료될 수 있습니다. 운영 중인 서버에서는 -x, -u 등으로 범위를 좁힌 뒤 실행하세요.

이 명령어로 풀 수 있는 실습 문제

브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.

관련 명령어

마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.