pkill
pkill은 process name과 user, parent PID, process group 등의 조건으로 실행 중인 process를 찾아 signal을 전송하는 procps-ng 명령어다. 기본 signal은 SIGTERM이며, 하나의 PID만 지정하는 kill과 달리 조건에 맞는 여러 process가 대상이 될 수 있다.
Installation
Linux에서는 일반적으로 procps 또는 procps-ng package에 포함된다.
Debian / Ubuntu
sudo apt update sudo apt install procps pkill --version
Fedora / RHEL
sudo dnf install procps-ng pkill --version
macOS
macOS는 BSD 계열 /usr/bin/pkill을 기본 제공하므로 별도 Homebrew 설치가 필요하지 않다. procps-ng 구현과 option이 다르므로 man pkill로 해당 OS의 문서를 확인한다. 공식 Homebrew procps formula는 없다.
Windows
procps-ng pkill의 공식 native Windows 또는 winget package는 없다. Linux 동작이 필요하면 WSL distribution 안에서 해당 distribution의 package를 설치한다.
wsl --install
sudo apt update sudo apt install procps pkill --version
Windows process를 native 환경에서 종료할 때는 PowerShell Stop-Process, taskkill, 또는 Sysinternals PsKill을 사용한다. 이 명령들은 pkill과 option 및 matching semantics가 다르다.
Usage
pkill [options] pattern
pkill [OPTIONS…] PATTERNpkill –signal SIGNAL [OPTIONS…] PATTERN
PATTERN은 extended regular expression이다. 여러 selection option을 함께 쓰면 모든 조건을 만족하는 process만 선택하며, comma로 나열한 동일 종류의 값은 그중 하나와 일치하면 된다.
Safe Workflow
동일한 selection option을 pgrep에 먼저 적용하여 대상 PID와 command를 확인한 뒤 pkill을 실행한다.
# 정확한 process name이 sleep인 대상 확인 pgrep -a -x sleep # 정상 종료 요청(SIGTERM) pkill --signal TERM --exact sleep # 종료 여부 확인 pgrep -a -x sleep
pkill은 조건에 맞는 모든 process에 signal을 보낸다. production host에서는 먼저 pgrep으로 대상을 확인하고 -x나 user/parent 조건으로 범위를 좁힌다. sudo pkill은 다른 사용자의 중요 process까지 종료할 수 있으므로 특히 주의한다.
Signals
# 기본값과 동일한 SIGTERM pkill -TERM -x appname pkill --signal TERM --exact appname # 설정 다시 읽기를 요청하는 관례적 signal pkill -HUP -x appname # 해당 system에서 지원하는 signal 확인 kill -l
SIGTERM(기본값): process가 cleanup과 상태 저장을 수행할 기회를 주는 정상 종료 요청이다.SIGHUP: daemon이 configuration reload 용도로 처리하는 경우가 있지만 application별 동작을 확인해야 한다.SIGINT: terminal에서 Ctrl+Ctrl를 누른 것과 유사하게 처리되는 경우가 많다.SIGKILL: process가 처리하거나 무시할 수 없는 강제 종료다. 정상 종료가 실패하고 결과를 이해한 경우에만 마지막 수단으로 사용한다.
systemctl stop SERVICE 또는 application 고유의 shutdown command로 종료한다.
Selection Options
-x,–exact: process name 전체가PATTERN과 정확히 일치해야 한다.-f,–full: process name 대신 전체 command line을 matching한다.-i,–ignore-case: 대소문자를 구분하지 않는다.-u,–euid ID,…: effective user ID 또는 user name으로 제한한다.-U,–uid ID,…: real user ID 또는 user name으로 제한한다.-P,–parent PPID,…: 지정한 parent process의 child로 제한한다.-g,–pgroup PGRP,…: process group ID로 제한한다.-G,–group GID,…: real group ID 또는 group name으로 제한한다.-s,–session SID,…: session ID로 제한한다.-t,–terminal TERM,…: controlling terminal로 제한한다.-n,–newest: 조건에 맞는 가장 최근 process 하나를 선택한다.-o,–oldest: 조건에 맞는 가장 오래된 process 하나를 선택한다.-F,–pidfile FILE: file에서 PID를 읽어 대상으로 제한한다.-L,–logpidfile: PID file이 lock되지 않았으면 실패한다.–ns PID,–nslist NAME,…: 지정한 PID와 같은 Linux namespace에 속한 process로 제한한다.
-f는 interpreter, shell, wrapper 또는 option 문자열까지 전체 command line에서 검색하므로 예상보다 넓게 일치할 수 있다. 실행 전에 반드시 같은 조건의 pgrep -a -f PATTERN 결과를 확인한다.
Examples
User로 제한
pgrep -a -u alice -x worker pkill -u alice -x worker
Parent PID로 제한
pgrep -a -P 1234 pkill --signal TERM -P 1234 worker
가장 최근 process 하나만 종료
pgrep -a -n -x worker pkill -n -x worker
종료를 기다려야 하는 script
pkill 성공은 signal 전송 성공을 뜻하며 process 종료 완료를 보장하지 않는다. script에서는 signal을 보낸 뒤 제한 시간 동안 상태를 확인하거나 service manager의 stop command를 사용한다.
pkill -TERM -x worker for attempt in 1 2 3 4 5; do pgrep -x worker >/dev/null || break sleep 1 done if pgrep -x worker >/dev/null; then echo 'worker did not stop after SIGTERM' >&2 exit 1 fi
Exit Status
0: 하나 이상의 process가 일치하고 signal 전송에 성공했다.1: 일치하는 process가 없거나 일치한 process에 signal을 보내지 못했다.2: command-line syntax 오류다.3: out-of-memory 같은 치명적 오류다.
version과 구현에 따라 세부 표현이 다를 수 있으므로 automation에서는 대상 system의 man pkill을 기준으로 확인한다.
Help
+ pkill --help (procps-ng 3.3.15)
Usage:
pkill [options] <pattern>
Options:
-<sig>, --signal <sig> signal to send (either number or name)
-e, --echo display what is killed
-c, --count count of matching processes
-f, --full use full process name to match
-g, --pgroup <PGID,...> match listed process group IDs
-G, --group <GID,...> match real group IDs
-i, --ignore-case match case insensitively
-n, --newest select most recently started
-o, --oldest select least recently started
-P, --parent <PPID,...> match only child processes of the given parent
-s, --session <SID,...> match session IDs
-t, --terminal <tty,...> match by controlling terminal
-u, --euid <ID,...> match by effective IDs
-U, --uid <ID,...> match by real IDs
-x, --exact match exactly with the command name
-F, --pidfile <file> read PIDs from file
-L, --logpidfile fail if PID file is not locked
--ns <PID> match the processes that belong to the same
namespace as <pid>
--nslist <ns,...> list which namespaces will be considered for
the --ns option.
Available namespaces: ipc, mnt, net, pid, user, uts
-h, --help display this help and exit
-V, --version output version information and exit
For more details see pgrep(1).
+
Troubleshooting
- 아무 process도 종료되지 않음:
pgrep에 같은 조건을 적용하고 pattern, user, namespace, 권한을 확인한다. - 긴 executable name이 일치하지 않음: Linux의 기본 process name matching은
/proc/PID/stat의 15자로 제한될 수 있다. 전체 command line이 꼭 필요할 때만-f를 사용한다. Operation not permitted: 일반적으로 다른 user의 process에 signal을 보낼 권한이 없다. 대상과 권한을 확인한 뒤에만 privilege를 높인다.- signal 전송 후에도 process가 보임: application이 signal을 처리 중이거나 무시할 수 있고 zombie process일 수도 있다. parent process와 service 상태를 확인한다.
- container 밖의 process가 예상과 다르게 보임: PID namespace와
/procmount가 matching 범위에 영향을 준다. 지원 version에서는–ns와–nslist로 제한한다. - option이 인식되지 않음: Linux procps-ng, macOS BSD 구현 및 procps-ng release마다 option 차이가 있다. 로컬
pkill –help또는man pkill을 확인한다.
Compatibility
Linux procps-ng의 기본 name matching은 process의 command name을 대상으로 하고 extended regular expression을 사용한다. pkill 자신은 match 대상에서 제외된다. 새 procps-ng의 –require-handler, –queue, –mrelease, –cgroup, –env 같은 option은 오래된 distribution에 없을 수 있으므로 배포 대상의 version을 확인한다.
macOS와 BSD의 pkill은 동일한 기본 목적을 제공하지만 option과 process selection 세부 동작이 Linux procps-ng와 완전히 같지 않다.
See Also
History
- codex:: 2026-07-21 pkill 설치, 안전한 대상 확인, signal, selection option, 예제, exit status, compatibility와 troubleshooting을 추가했다.