killall 명령어: 프로세스 이름으로 끝내기와 -9 시그널, psmisc 설치

killall 명령어는 프로세스 번호(PID) 대신 프로그램 이름으로 실행 중인 프로세스를 골라 신호를 보내는 리눅스 명령어이며, 신호를 적지 않으면 SIGTERM을 보냅니다(공식 매뉴얼 기준). 이름이 같은 프로세스를 한꺼번에 끝내는 명령이라 AlmaLinux 9 서버에서 sleep을 다른 이름으로 복사해 띄운 네 프로세스를 pgrep과 ps로 먼저 확인했고, 15자보다 긴 실행 파일은 프로세스 이름에 앞 15자만 남아 있었습니다.
killall은 Debian 12 서버의 일반 계정에서 시험용으로 띄운 xxsleep 프로세스에만 실행했습니다. 결과 상자는 AlmaLinux 9.8 서버의 root 계정에서 실행한 rpm, pgrep, ps, pidof, cat, kill 출력과 Debian 12 서버에서 실행한 killall 출력입니다. 프로세스 번호(PID)와 프로세스 이름, 실행 파일 경로, 계정 이름은 예시 값으로 바꿨습니다.
1️⃣ killall 명령어 설치
killall은 psmisc 패키지에 들어 있습니다. AlmaLinux 9.8 서버에서 /usr/bin/killall이 속한 패키지를 rpm으로 확인하자 psmisc 23.4 버전이 나왔습니다.
rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killallpsmisc 23.4rpm -ql로 본 같은 패키지의 파일 목록에는 pstree와 fuser도 함께 들어 있었습니다.
명령을 찾지 못한다는 [command not found]가 나오면 psmisc 패키지를 설치합니다. RHEL 계열은 [dnf install psmisc], Debian 계열은 [apt install psmisc] 꼴입니다. Debian 12 서버에는 psmisc 23.6 버전이 이미 설치되어 있었고, killall은 /usr/bin/killall에 있었습니다.
AlmaLinux 9.8 서버에서 확인하자 이름이 비슷한 pkill은 procps-ng 패키지에 들어 있었고, kill은 셸 내장 명령이었습니다.
2️⃣ killall 명령어 사용법
기본 꼴은 [killall 프로세스 이름]입니다. 적은 이름으로 실행 중인 프로세스를 모두 찾아 신호를 보내고, 이름을 여러 개 적으면 이름마다 같은 일을 합니다(공식 매뉴얼 기준).
같은 이름의 프로세스가 한 번에 끝나므로, 그 이름으로 무엇이 실행 중인지 pgrep으로 먼저 확인합니다. 작업 폴더에 sleep을 xxsleep-a1, xxsleep-a2, xxsleep-longname-x1이라는 이름으로 복사하고 xxsleep-a1만 두 번 띄워 모두 네 개를 실행한 뒤, -l로 번호와 이름을 출력했습니다.
pgrep -l xxsleep2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnam네 번째 줄은 실행 파일 이름이 xxsleep-longname-x1인데, 프로세스 이름은 xxsleep-longnam에서 끊겨 있었습니다.
-a를 붙이면 실행한 명령 줄 전체가 나옵니다. 이름이 같은 두 xxsleep-a1은 끝의 초 단위 인자 300과 310으로 구분했습니다.
pgrep -a xxsleep2141 /root/work/xxsleep-a1 300
2142 /root/work/xxsleep-a1 310
2150 /root/work/xxsleep-a2 320
2155 /root/work/xxsleep-longname-x1 330이름이 정확히 같은 프로세스만 찾을 때는 -x를 붙입니다. xxsleep-a1을 넣은 결과는 번호 두 개였습니다.
pgrep -x xxsleep-a12141
2142이름 하나를 그대로 넣어 번호만 확인할 때는 pidof를 사용합니다. xxsleep-a1을 찾자 두 번호가 한 줄에 나왔습니다.
pidof xxsleep-a12142 2141ps는 -C 뒤에 쉼표로 여러 이름을 적어 이름이 정확히 같은 프로세스만 출력합니다.
ps -o pid,comm -C xxsleep-a1,xxsleep-a2 PID COMMAND
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2Debian 12 서버에서 같은 이름으로 네 프로세스를 띄우고 [killall xxsleep-a1]을 실행하자, 아무것도 출력하지 않고 종료 코드 0으로 끝났습니다. pgrep으로 다시 찾자 두 xxsleep-a1은 사라지고 xxsleep-a2와 xxsleep-longname-x1만 남아 있었습니다. 이름 대신 슬래시(/)가 들어간 경로를 적으면 이름과 관계없이 그 파일을 실행 중인 프로세스를 고릅니다(공식 매뉴얼 기준).
없는 이름 xxsleep-zz를 적자 이름 뒤에 [no process found]가 붙은 줄이 나오고, 종료 코드 1로 끝났습니다. 종료 코드는 적은 이름마다 하나 이상 끝냈을 때만 0입니다(공식 매뉴얼 기준).
killall xxsleep-zzxxsleep-zz: no process found번호를 알고 있는 프로세스 하나만 끝낼 때는 리눅스 kill 명령어로 그 번호에만 신호를 보냅니다.
3️⃣ killall 명령어 옵션
xxsleep-longname-x1로 띄운 프로세스의 이름을 /proc/번호/comm에서 읽자, 앞 15자인 xxsleep-longnam만 남아 있었습니다.
cat /proc/2155/commxxsleep-longnam16자인 xxsleep-longname으로 pgrep을 실행했습니다.
pgrep -a xxsleep-longname출력 없이 종료 코드 1로 끝났고, 15자인 xxsleep-longnam으로 다시 찾은 결과에는 그 프로세스가 나왔습니다.
pgrep -l xxsleep-longnam2155 xxsleep-longnamkillall은 15자보다 긴 이름을 받았을 때 전체 이름을 읽지 못하는 프로세스가 있으면 앞 15자가 맞는 것을 모두 대상으로 삼고, -e를 붙이면 그런 항목을 건너뜁니다(공식 매뉴얼 기준). Debian 12 서버에서 -e와 -v를 붙여 앞 15자인 xxsleep-longnam을 적자, 이름이 15자에서 끊긴 다른 프로세스 셋을 건너뛰었다는 줄이 나오고 [no process found]로 끝났습니다.
killall -e -v xxsleep-longnamkillall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
xxsleep-longnam: no process found전체 이름 xxsleep-longname-x1을 적자 같은 건너뜀 줄 뒤에 그 프로세스에 신호를 보낸 줄이 나왔습니다.
killall -e -v xxsleep-longname-x1killall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
Killed xxsleep-longname-x1(2155) with signal 15-v를 붙이자 신호를 보낸 프로세스마다 이름과 번호, 신호 번호가 든 줄이 나왔습니다.
killall -v xxsleep-a2Killed xxsleep-a2(2150) with signal 15-i는 프로세스마다 끝낼지 묻습니다. xxsleep-a1 둘을 다시 띄우고 답을 표준 입력으로 y와 n 차례로 넣자 두 물음이 한 줄에 이어 나왔고, 첫째 xxsleep-a1만 끝나고 둘째는 남았습니다.
printf 'y\nn\n' | killall -i xxsleep-a1Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)-u는 그 계정이 소유한 프로세스만 고르며, 이름을 생략하면 그 계정의 프로세스 전체가 대상입니다. 계정 이름 뒤에 xxsleep-a1을 함께 적자 남아 있던 xxsleep-a1에만 신호를 보냈습니다.
killall -v -u user xxsleep-a1Killed xxsleep-a1(2172) with signal 15-o와 -y는 시작한 시각으로 고르고, 시간은 [-o 30m]처럼 숫자 뒤에 s, m, h, d, w, M, y 단위를 붙여 적습니다.
-r은 이름을 확장 정규식으로 읽습니다. ^xxsleep-a 패턴을 pgrep에 넣자 xxsleep-a로 시작하는 세 프로세스가 나왔습니다.
pgrep -l '^xxsleep-a'2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2-w는 신호를 보낸 프로세스가 모두 사라질 때까지 1초마다 확인하며 기다립니다. 신호를 무시하거나 좀비 상태로 남은 프로세스라면 끝없이 기다릴 수 있습니다.
아래 첫째 표는 이 글에서 실제로 실행한 확인 명령과 killall 옵션이고, 실행하지 않은 killall 옵션은 둘째 표에 공식 매뉴얼 기준으로 모았습니다.
📌 프로세스 확인과 killall: 이 글에서 실행한 결과
| 명령 | 하는 일 | 이 글에서 본 결과 | |
|---|---|---|---|
| pgrep -l 이름 | 이름이 들어간 프로세스의 번호와 이름 | xxsleep으로 네 줄이 나오고, 긴 이름은 앞 15자 xxsleep-longnam까지만 보임 | |
| pgrep -a 이름 | 번호와 실행한 명령 줄 전체 | 이름이 같은 두 xxsleep-a1을 끝의 인자 300과 310으로 구분 | |
| pgrep -x 이름 | 이름이 정확히 같은 프로세스의 번호만 | xxsleep-a1로 2141과 2142 두 줄 | |
| pidof 이름 | 그 이름으로 실행 중인 번호를 한 줄에 | xxsleep-a1로 2142 2141 | |
| ps -o pid,comm -C 이름 | 이름이 정확히 같은 프로세스의 번호와 이름, 쉼표로 여러 이름 | xxsleep-a1 두 줄과 xxsleep-a2 한 줄 | |
| cat /proc/번호/comm | 프로세스 이름(앞 15자까지) | 2155는 xxsleep-longnam | |
| killall 이름 | 그 이름의 프로세스에 SIGTERM | xxsleep-a1 두 개가 끝나고 종료 코드 0, 없는 이름 xxsleep-zz는 no process found와 종료 코드 1 | |
| killall -e 이름 | 15자보다 긴 이름은 전체 이름이 맞을 때만 | xxsleep-longnam은 no process found, xxsleep-longname-x1은 끝남 | |
| killall -v 이름 | 신호를 보낸 프로세스마다 결과 출력 | Killed xxsleep-a2(2150) with signal 15 | |
| killall -i 이름 | 끝내기 전에 프로세스마다 확인 | y와 n을 넣자 첫째 xxsleep-a1만 끝남 | |
| killall -u 계정 이름 | 그 계정이 소유한 프로세스만 | 이름과 함께 적어 그 계정의 xxsleep-a1만 끝남 | |
| killall -9 이름 | SIGTERM 대신 SIGKILL | Killed xxsleep-a2(2173) with signal 9 |
📎 그 밖의 옵션: 공식 매뉴얼 기준
| 옵션 | 하는 일 | |
|---|---|---|
| -I, --ignore-case | 이름을 대소문자 구분 없이 비교 | |
| -g, --process-group | 프로세스 대신 그 프로세스 그룹에 신호(그룹마다 한 번) | |
| -l, --list | 아는 신호 이름 목록 | |
| -n, --ns PID | 그 PID와 같은 PID 네임스페이스의 프로세스만, 기본은 모든 네임스페이스 | |
| -o, --older-than 시간 | 그 시간보다 먼저 시작한 프로세스만(단위 s, m, h, d, w, M, y) | |
| -q, --quiet | 끝낸 프로세스가 없어도 알리지 않음 | |
| -r, --regexp | 이름을 확장 정규식으로 읽음 | |
| -s, --signal 신호 | SIGTERM 대신 보낼 신호 | |
| -V, --version | 버전 정보 출력 | |
| -w, --wait | 신호를 보낸 프로세스가 모두 사라질 때까지 기다림 | |
| -y, --younger-than 시간 | 그 시간보다 나중에 시작한 프로세스만 | |
| -Z, --context 패턴 | 보안 컨텍스트가 확장 정규식 패턴과 맞는 프로세스만, 다른 인자보다 앞에 적음, 이름은 생략 가능 |
🔲 killall 명령어 시뮬레이터
아래 시뮬레이터는 xxsleep 네 프로세스에 예시 계정 user1의 xxsleep-a2를 더한 목록으로 시작합니다. 칩을 눌러 [killall -v]와 [-i], [-u]로 목록에서 사라지는 줄을 비교할 수 있으며, killall 출력 문구는 Debian 12 서버에서 실행한 출력에 맞춘 흉내입니다.
4️⃣ killall 시그널
보낼 신호는 [-HUP]이나 [-SIGHUP]처럼 이름으로, [-1]처럼 번호로, 또는 -s 옵션 뒤에 적습니다(공식 매뉴얼 기준). [killall -9 프로세스 이름]은 9번 신호인 SIGKILL을 보냅니다. SIGKILL은 프로세스가 잡거나 무시할 수 없는 신호라(공식 매뉴얼 기준) 프로세스가 마무리 작업을 하지 못하고 끝납니다. 그래서 기본 신호인 SIGTERM으로 끝나지 않을 때 보냅니다.
Debian 12 서버에서 다시 띄운 xxsleep-a2에 -v와 함께 -9를 붙이자, 신호 번호 9가 찍힌 줄이 나왔습니다.
killall -9 -v xxsleep-a2Killed xxsleep-a2(2173) with signal 9신호 이름과 번호는 [kill -l]로 확인했습니다. killall에도 아는 신호 이름을 출력하는 -l 옵션이 있습니다.
kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX번호 하나를 넣자 그 신호 이름만 나왔습니다. killall이 기본으로 보내는 15는 TERM, -9로 보내는 9는 KILL이었습니다.
kill -l 15TERMkill -l 9KILL목록에 없는 신호 이름을 적으면 [FOO: unknown signal; killall -l lists signals.] 꼴의 문구가 나옵니다(공식 매뉴얼·프로그램 문구 기준).
🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.