{{tag>[cli linux process procps-ng pkill signal]}}
====== 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...] PATTERN''
* ''**pkill** --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+C를 누른 것과 유사하게 처리되는 경우가 많다.
* ''SIGKILL'': process가 처리하거나 무시할 수 없는 강제 종료다. 정상 종료가 실패하고 결과를 이해한 경우에만 마지막 수단으로 사용한다.
signal 의미는 application의 signal handler에 따라 달라질 수 있다. service manager가 관리하는 daemon은 가능하면 ''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]
Options:
-, --signal 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 match listed process group IDs
-G, --group match real group IDs
-i, --ignore-case match case insensitively
-n, --newest select most recently started
-o, --oldest select least recently started
-P, --parent match only child processes of the given parent
-s, --session match session IDs
-t, --terminal match by controlling terminal
-u, --euid match by effective IDs
-U, --uid match by real IDs
-x, --exact match exactly with the command name
-F, --pidfile read PIDs from file
-L, --logpidfile fail if PID file is not locked
--ns match the processes that belong to the same
namespace as
--nslist 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와 ''/proc'' mount가 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 =====
* [[systemd:systemctl|systemctl]]
* [[https://man7.org/linux/man-pages/man1/pgrep.1.html|procps-ng pgrep/pkill manual]]
* [[https://gitlab.com/procps-ng/procps|procps-ng upstream repository]]
* [[https://packages.debian.org/stable/procps|Debian procps package]]
* [[https://packages.fedoraproject.org/pkgs/procps-ng/procps-ng/|Fedora procps-ng package]]
* [[https://learn.microsoft.com/windows/wsl/install|Microsoft WSL installation]]
===== History =====
* codex:: 2026-07-21 pkill 설치, 안전한 대상 확인, signal, selection option, 예제, exit status, compatibility와 troubleshooting을 추가했다.
{{indexmenu>.#1|js}}