pgrep 명령어: 이름으로 PID 찾기와 -f 옵션, pidof & pkill 차이

실행 중인 프로세스의 번호(PID)를 이름이나 계정, 명령 줄로 찾을 때는 pgrep 명령어를 사용합니다. AlmaLinux 9 서버에서 sleep 프로그램을 다른 이름으로 복사해 세 개를 띄우고 옵션마다 찾은 프로세스를 비교했습니다. 이름으로 찾을 때는 그 세 프로세스만 나왔고, -f로 명령 줄 전체에서 찾자 그 프로세스를 실행한 timeout까지 함께 나왔습니다.
아래 출력은 AlmaLinux 9.8 서버의 root 계정과 Debian 12 서버의 일반 계정에서 실행한 결과입니다. 찾는 대상은 sleep을 pgdemo-a, pgdemo-b라는 이름으로 복사해 timeout 300으로 띄운 프로세스로, 5분 뒤 스스로 끝나게 했습니다. 프로세스 번호(PID)와 Debian 계정 이름(user1)은 예시 값으로 바꿨고, AlmaLinux 서버의 procps-ng 버전 번호는 주·부 버전까지만 적었습니다.
1️⃣ pgrep 명령어 기본 사용법
pgrep 뒤에 이름의 일부를 적으면 그 글자가 들어간 프로세스의 번호를 한 줄에 하나씩 출력합니다. pgdemo로 찾자 pgdemo-a 두 개와 pgdemo-b 한 개, 모두 세 번호가 나왔습니다.
pgrep pgdemo2143
2152
2155이름을 pgdemo-a까지 적으면 pgdemo-a 두 개만 남았습니다.
pgrep pgdemo-a2143
2152찾는 글자는 확장 정규식으로 읽고, 옵션이 없으면 프로세스 이름에서만 찾습니다.
찾는 프로세스가 없으면 아무것도 출력하지 않고 끝나므로, 결과는 종료 코드로 확인합니다. 없는 이름 pgdemo-zz를 찾은 뒤 [echo $?]를 실행하자 1이 나왔습니다.
pgrep pgdemo-zzecho $?1조건을 하나도 적지 않고 실행하자 아래 오류와 함께 종료 코드 2가 나왔습니다. man 페이지는 종료 코드를 0(찾음), 1(못 찾음), 2(명령 줄 문법 오류), 3(메모리 부족 같은 치명적 오류)으로 설명합니다.
pgreppgrep: no matching criteria specified
Try `pgrep --help' for more information.echo $?2출력 대신 이 종료 코드를 조건으로 두면, 스크립트에서 프로세스가 실행 중인지 확인할 수 있습니다. 버전은 [pgrep -V]로 확인합니다. Debian 12 서버는 procps-ng 4.0.2, AlmaLinux 9.8 서버는 procps-ng 3.3 버전이었습니다.
pgrep -Vpgrep from procps-ng 4.0.22️⃣ pgrep -f 옵션과 -l, -a 출력
번호만으로는 어떤 프로세스인지 알 수 없어, -l로 이름을, -a로 명령 줄 전체를 함께 출력합니다.
pgrep -l pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -a pgdemo2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300-a 출력 끝의 300과 301은 sleep에 넘긴 초 단위 인자입니다. 이름이 같은 두 pgdemo-a를 이 인자로 구분했습니다.
-f를 붙이면 이름이 아니라 명령 줄 전체에서 찾습니다. pgdemo-a를 -f로 찾자 번호가 두 개에서 네 개로 늘었습니다.
pgrep -f pgdemo-a2141
2143
2150
2152-a를 함께 붙여 보니, 늘어난 두 줄은 pgdemo-a를 인자로 받아 실행한 timeout이었습니다. 이름은 timeout이지만 명령 줄에 pgdemo-a가 들어 있어 -f 조건에 맞았습니다.
pgrep -af pgdemo-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301스크립트 안에서 -f를 사용할 때는 스크립트 자신도 결과에 나오는지 확인합니다. pgrep은 실행 중인 자기 자신을 결과에 넣지 않지만, pgrep을 실행한 스크립트의 명령 줄에 찾는 글자가 있으면 그 스크립트도 결과에 나옵니다.
받은 글자를 그대로 [pgrep -af]에 넘기는 스크립트 chk.sh로 pgdemo-a를 찾자, 마지막 줄에 스크립트 자신인 bash chk.sh pgdemo-a가 더해졌습니다.
bash chk.sh pgdemo-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-a패턴의 첫 글자를 대괄호로 감싼 [p]gdemo-a는 정규식으로는 pgdemo-a와 같은 글자를 찾지만, 스크립트 명령 줄에는 대괄호까지 그대로 적혀 있어 조건에 맞지 않습니다. 같은 스크립트에 이 패턴을 넘기자 스크립트 줄이 빠지고 네 줄만 남았습니다.
bash chk.sh '[p]gdemo-a'2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 3013️⃣ pgrep 조건 옵션
-x를 붙이면 이름의 일부가 아니라 이름 전체가 같은 프로세스만 찾습니다. pgdemo로는 아무것도 나오지 않았고, pgdemo-a로 찾자 두 개가 나왔습니다.
pgrep -x pgdemopgrep -lx pgdemo-a2143 pgdemo-a
2152 pgdemo-a-u는 프로세스를 실행한 계정으로 고릅니다. 계정을 쉼표로 여럿 적으면 그중 한 계정에 해당하는 프로세스를 모두 찾습니다. root로 실행한 세 프로세스는 [-u root]로 모두 나왔고, [-u daemon]으로는 하나도 나오지 않았습니다.
pgrep -u root -l pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -u daemon -l pgdemopgrep -u root,daemon -c pgdemo3없는 계정을 적자 [invalid user name] 오류와 함께 종료 코드 2가 나왔습니다.
pgrep -u no-such-user9 pgdemopgrep: invalid user name: no-such-user9Debian 12 서버의 일반 계정에서도 자기 계정으로 띄운 sleep 하나를 같은 옵션으로 찾았습니다.
pgrep -u user1 -l sleep3047 sleeppgrep -u user1 -a sleep3047 sleep 60같은 이름이 여럿일 때 -n은 가장 최근에 시작한 하나, -o는 가장 먼저 시작한 하나만 출력합니다. 2초 간격으로 띄운 두 pgdemo-a 가운데 -n은 나중 것을, -o는 먼저 것을 골랐습니다.
pgrep -n pgdemo-a2152pgrep -o pgdemo-a2143man 페이지는 -n과 -o를 함께 사용할 수 없다고 설명합니다. 둘을 같이 적자 오류 문구 없이 사용법만 나왔습니다.
-c는 번호 대신 개수를 출력합니다. 찾지 못하면 0을 출력하고 종료 코드는 1이었습니다.
pgrep -c pgdemo3pgrep -c pgdemo-zz0pgrep 옵션을 정리하면 아래와 같습니다.
| 옵션 | 복사 | 설명 |
|---|---|---|
| -f--full | 이름이 아니라 명령 줄 전체에서 찾기 | |
| -l--list-name | 번호와 함께 이름 출력 | |
| -a--list-full | 번호와 함께 명령 줄 전체 출력 | |
| -x--exact | 이름 전체가 같은 프로세스만 찾기 | |
| -u--euid | 지정한 계정이 실행한 프로세스만, 쉼표로 여럿 적으면 그중 한 계정 | |
| -n--newest | 조건에 맞는 것 중 가장 최근에 시작한 하나 | |
| -o--oldest | 조건에 맞는 것 중 가장 먼저 시작한 하나 | |
| -c--count | 번호 대신 개수 출력, 0개면 종료 코드 1 | |
| -d--delimiter | 번호 사이 구분자 지정(기본은 줄 바꿈) | |
| -V--version | 버전 출력 |
| 옵션 | 복사 | 설명 |
|---|---|---|
| -i--ignore-case | 대소문자 구분 없이 찾기 | |
| -v--inverse | 조건에 맞지 않는 프로세스 찾기 | |
| -P--parent | 지정한 부모 번호(PPID)의 자식 프로세스만 | |
| -t--terminal | 지정한 터미널에 연결된 프로세스만 | |
| -g--pgroup | 지정한 프로세스 그룹 번호에 속한 프로세스만 | |
| -s--session | 지정한 세션 번호에 속한 프로세스만 | |
| -U--uid | 실제 사용자 ID가 같은 프로세스만 | |
| -G--group | 실제 그룹 ID가 같은 프로세스만 | |
| -w--lightweight | 프로세스 번호 대신 스레드 번호를 모두 출력 |
🔲 pgrep 명령어 시뮬레이터
아래 시뮬레이터는 pgdemo와 timeout 여섯 줄에 예시 프로세스를 더한 목록으로 시작합니다. 칩을 눌러 옵션마다 찾은 줄을 왼쪽 목록에서 비교하고, [pkill pgdemo-b] 뒤 [pgrep -l pgdemo]로 줄어든 결과를 확인할 수 있습니다.
4️⃣ pgrep과 pidof, pkill 차이
pidof는 정규식 없이 프로그램 이름 전체가 같은 프로세스만 찾고, 번호를 한 줄에 띄어 써서 출력합니다. pgdemo-a를 찾자 두 번호가 한 줄에 나왔고, 나중에 시작한 2152가 앞이었습니다.
pidof pgdemo-a2152 2143이름 일부인 pgdemo로는 pgrep과 달리 아무것도 찾지 못했고, 종료 코드는 1이었습니다. 번호 하나만 필요하면 -s를 붙입니다. [pidof -s pgdemo-a]는 2152 하나를 출력했습니다.
pidof pgdemopidof -s pgdemo-a2152찾은 번호로 시작 시각과 부모 번호(PPID)까지 보려면, pgrep -d로 번호를 쉼표로 이어 ps 명령어의 -p에 넘깁니다.
pgrep -d, pgdemo2143,2152,2155ps -fp $(pgrep -d, -x pgdemo-a)UID PID PPID C STIME TTY TIME CMD
root 2143 2141 0 15:59 ? 00:00:00 ./pgdemo-a 300
root 2152 2150 0 15:59 ? 00:00:00 ./pgdemo-a 301PPID 칸의 2141과 2150은 두 pgdemo-a를 실행한 timeout의 번호입니다.
pkill은 pgrep과 같은 조건으로 프로세스를 찾되, 번호를 출력하는 대신 신호를 보냅니다. 신호를 적지 않으면 SIGTERM을 보내고, [pkill -HUP 이름]처럼 신호를 바꿀 수 있습니다.
pkill은 찾는 즉시 신호를 보내므로, 같은 조건의 [pgrep -a]나 [pgrep -af]로 대상을 먼저 확인합니다. -f로 찾으면 명령 줄에 같은 글자가 든 timeout이나 스크립트도 대상에 들어갑니다. 번호를 이미 알고 있다면 kill 명령어로 그 번호에만 신호를 보냅니다.
| 명령 | 찾는 기준 | 출력 | 하는 일 |
|---|---|---|---|
| pgrep | 이름 일부(정규식) · -f면 명령 줄 전체 | 번호 · -l, -a로 이름과 명령 줄 | 찾기만 |
| pidof | 프로그램 이름 전체 | 번호를 한 줄에 | 찾기만 |
| pkill | pgrep과 같은 조건 | 없음 | 찾은 프로세스에 신호(기본 SIGTERM) |
🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.