Lệnh killall: dừng tiến trình theo tên, tín hiệu -9 và cài đặt psmisc
Lệnh killall là lệnh Linux chọn các tiến trình đang chạy theo tên chương trình thay vì số tiến trình (PID) rồi gửi tín hiệu cho chúng; nếu bạn không chỉ định tín hiệu, lệnh sẽ gửi SIGTERM (theo tài liệu chính thức). Vì lệnh này dừng cùng lúc mọi tiến trình có cùng tên, trên máy chủ AlmaLinux 9 chúng tôi đã kiểm tra trước bằng pgrep và ps bốn tiến trình chạy từ các bản sao của sleep mang tên khác; với tệp thực thi có tên dài hơn 15 ký tự, tên tiến trình chỉ còn 15 ký tự đầu.
Chúng tôi chỉ chạy killall trên các tiến trình xxsleep được khởi động để thử nghiệm bằng tài khoản thường trên máy chủ Debian 12. Các hộp kết quả là đầu ra của rpm, pgrep, ps, pidof, cat và kill chạy bằng tài khoản root trên máy chủ AlmaLinux 9.8, và đầu ra của killall chạy trên máy chủ Debian 12. Số tiến trình (PID), tên tiến trình, đường dẫn tệp thực thi và tên tài khoản đã được thay bằng giá trị ví dụ.
1️⃣ Cài đặt lệnh killall
killall nằm trong gói psmisc. Khi kiểm tra bằng rpm trên máy chủ AlmaLinux 9.8 xem /usr/bin/killall thuộc gói nào, kết quả là phiên bản psmisc 23.4.
rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killallpsmisc 23.4Danh sách tệp của cùng gói đó, xem bằng rpm -ql, cũng có pstree và fuser.
Nếu xuất hiện [command not found], tức là không tìm thấy lệnh, hãy cài gói psmisc. Họ RHEL dùng [dnf install psmisc], còn họ Debian dùng [apt install psmisc]. Máy chủ Debian 12 đã cài sẵn psmisc 23.6, và killall nằm ở /usr/bin/killall.
Khi kiểm tra trên máy chủ AlmaLinux 9.8, pkill có tên gần giống nằm trong gói procps-ng, còn kill là lệnh tích hợp sẵn của shell.
2️⃣ Cách dùng lệnh killall
Dạng cơ bản là [killall tên tiến trình]. Lệnh tìm mọi tiến trình đang chạy với tên đã cho rồi gửi tín hiệu; nếu bạn ghi nhiều tên, lệnh làm điều tương tự cho từng tên (theo tài liệu chính thức).
Vì các tiến trình cùng tên đều dừng cùng lúc, hãy kiểm tra trước bằng pgrep xem có gì đang chạy với tên đó. Chúng tôi sao chép sleep vào thư mục làm việc với các tên xxsleep-a1, xxsleep-a2 và xxsleep-longname-x1, chạy xxsleep-a1 hai lần, tổng cộng bốn tiến trình, rồi in số và tên bằng -l.
pgrep -l xxsleep2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnamỞ dòng thứ tư, tệp thực thi tên là xxsleep-longname-x1, nhưng tên tiến trình bị cắt ở xxsleep-longnam.
Thêm -a sẽ hiện toàn bộ dòng lệnh đã chạy. Hai xxsleep-a1 cùng tên được phân biệt bằng đối số giây ở cuối, 300 và 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Để chỉ tìm các tiến trình có tên khớp chính xác, hãy thêm -x. Kết quả với xxsleep-a1 là hai số.
pgrep -x xxsleep-a12141
2142Để chỉ kiểm tra số bằng cách nhập nguyên một tên, hãy dùng pidof. Khi tìm xxsleep-a1, hai số hiện trên cùng một dòng.
pidof xxsleep-a12142 2141ps chỉ in các tiến trình có tên khớp chính xác khi bạn ghi nhiều tên cách nhau bằng dấu phẩy sau -C.
ps -o pid,comm -C xxsleep-a1,xxsleep-a2 PID COMMAND
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2Trên máy chủ Debian 12, chúng tôi khởi động bốn tiến trình với cùng các tên rồi chạy [killall xxsleep-a1]: lệnh không in gì và kết thúc với mã thoát 0. Khi tìm lại bằng pgrep, hai xxsleep-a1 đã biến mất, chỉ còn xxsleep-a2 và xxsleep-longname-x1. Nếu bạn ghi đường dẫn có dấu gạch chéo (/) thay cho tên, lệnh sẽ chọn các tiến trình đang chạy tệp đó bất kể tên (theo tài liệu chính thức).
Khi ghi tên không tồn tại xxsleep-zz, xuất hiện một dòng có [no process found] sau tên và kết thúc với mã thoát 1. Mã thoát chỉ là 0 khi với mỗi tên đã ghi có ít nhất một tiến trình bị dừng (theo tài liệu chính thức).
killall xxsleep-zzxxsleep-zz: no process foundKhi chỉ muốn dừng một tiến trình đã biết số, hãy gửi tín hiệu chỉ đến số đó bằng kill: Lệnh kill của Linux.
3️⃣ Tùy chọn của lệnh killall
Khi đọc tên của tiến trình khởi động bằng xxsleep-longname-x1 từ /proc/PID/comm, chỉ còn 15 ký tự đầu là xxsleep-longnam.
cat /proc/2155/commxxsleep-longnamChúng tôi chạy pgrep với xxsleep-longname dài 16 ký tự.
pgrep -a xxsleep-longnameLệnh kết thúc không có đầu ra với mã thoát 1, và khi tìm lại bằng xxsleep-longnam dài 15 ký tự thì tiến trình đó xuất hiện.
pgrep -l xxsleep-longnam2155 xxsleep-longnamKhi killall nhận tên dài hơn 15 ký tự và có tiến trình mà nó không đọc được tên đầy đủ, mọi tiến trình khớp 15 ký tự đầu đều thành đối tượng; thêm -e thì các mục đó bị bỏ qua (theo tài liệu chính thức). Trên máy chủ Debian 12, khi ghi 15 ký tự đầu xxsleep-longnam kèm -e và -v, xuất hiện các dòng cho biết đã bỏ qua ba tiến trình khác có tên bị cắt ở 15 ký tự, rồi kết thúc bằng [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 foundKhi ghi tên đầy đủ xxsleep-longname-x1, sau các dòng bỏ qua giống hệt là một dòng cho biết đã gửi tín hiệu đến tiến trình đó.
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 15Khi thêm -v, với mỗi tiến trình được gửi tín hiệu sẽ có một dòng chứa tên, số và số tín hiệu.
killall -v xxsleep-a2Killed xxsleep-a2(2150) with signal 15-i hỏi từng tiến trình có dừng hay không. Chúng tôi khởi động lại hai xxsleep-a1 và lần lượt đưa y và n qua đầu vào chuẩn: hai câu hỏi hiện nối tiếp trên một dòng, chỉ xxsleep-a1 thứ nhất dừng, còn cái thứ hai vẫn chạy.
printf 'y\nn\n' | killall -i xxsleep-a1Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)-u chỉ chọn các tiến trình thuộc sở hữu của tài khoản đó, và nếu bỏ tên thì toàn bộ tiến trình của tài khoản đó là đối tượng. Khi ghi thêm xxsleep-a1 sau tên tài khoản, tín hiệu chỉ được gửi đến xxsleep-a1 còn lại.
killall -v -u user xxsleep-a1Killed xxsleep-a1(2172) with signal 15-o và -y chọn theo thời điểm bắt đầu, còn thời gian được ghi bằng số kèm đơn vị s, m, h, d, w, M hoặc y phía sau, như [-o 30m].
-r đọc tên dưới dạng biểu thức chính quy mở rộng. Khi đưa mẫu ^xxsleep-a vào pgrep, có ba tiến trình bắt đầu bằng xxsleep-a xuất hiện.
pgrep -l '^xxsleep-a'2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2-w chờ, kiểm tra mỗi giây, cho đến khi mọi tiến trình đã được gửi tín hiệu biến mất. Nếu tiến trình bỏ qua tín hiệu hoặc còn lại ở trạng thái zombie, việc chờ có thể không bao giờ kết thúc.
Bảng đầu tiên dưới đây gồm các lệnh kiểm tra và tùy chọn killall thực sự đã chạy trong bài này, còn các tùy chọn killall chưa chạy được gom vào bảng thứ hai theo tài liệu chính thức.
📌 Kiểm tra tiến trình và killall: kết quả chạy trong bài này
| Lệnh | Chức năng | Kết quả trong bài này | |
|---|---|---|---|
| pgrep -l tên | Số và tên của các tiến trình có tên chứa chuỗi đó | xxsleep cho bốn dòng; tên dài chỉ hiện đến 15 ký tự đầu là xxsleep-longnam | |
| pgrep -a tên | Số và toàn bộ dòng lệnh | Hai xxsleep-a1 cùng tên được phân biệt bằng đối số cuối 300 và 310 | |
| pgrep -x tên | Chỉ số của các tiến trình có tên khớp chính xác | xxsleep-a1 cho hai dòng: 2141 và 2142 | |
| pidof tên | Các số đang chạy với tên đó, trên một dòng | xxsleep-a1 cho 2142 2141 | |
| ps -o pid,comm -C tên | Số và tên của các tiến trình có tên khớp chính xác; nhiều tên cách nhau bằng dấu phẩy | Hai dòng xxsleep-a1 và một dòng xxsleep-a2 | |
| cat /proc/PID/comm | Tên tiến trình (tối đa 15 ký tự đầu) | 2155 là xxsleep-longnam | |
| killall tên | SIGTERM đến các tiến trình có tên đó | Hai xxsleep-a1 dừng với mã thoát 0; tên không tồn tại xxsleep-zz cho no process found và mã thoát 1 | |
| killall -e tên | Tên dài hơn 15 ký tự chỉ khi tên đầy đủ khớp | xxsleep-longnam cho no process found, xxsleep-longname-x1 dừng | |
| killall -v tên | In kết quả cho mỗi tiến trình được gửi tín hiệu | Killed xxsleep-a2(2150) with signal 15 | |
| killall -i tên | Hỏi xác nhận từng tiến trình trước khi dừng | Nhập y và n thì chỉ xxsleep-a1 thứ nhất dừng | |
| killall -u tên tài khoản | Chỉ các tiến trình thuộc sở hữu của tài khoản đó | Ghi cùng một tên thì chỉ xxsleep-a1 của tài khoản đó dừng | |
| killall -9 tên | SIGKILL thay cho SIGTERM | Killed xxsleep-a2(2173) with signal 9 |
📎 Tùy chọn khác: theo tài liệu hướng dẫn chính thức
| Tùy chọn | Chức năng | |
|---|---|---|
| -I, --ignore-case | So sánh tên không phân biệt chữ hoa và chữ thường | |
| -g, --process-group | Gửi tín hiệu đến nhóm tiến trình thay vì tiến trình (mỗi nhóm một lần) | |
| -l, --list | Danh sách tên tín hiệu đã biết | |
| -n, --ns PID | Chỉ các tiến trình trong cùng PID namespace với PID đó; mặc định là mọi namespace | |
| -o, --older-than thời gian | Chỉ các tiến trình bắt đầu trước thời gian đó (đơn vị s, m, h, d, w, M, y) | |
| -q, --quiet | Không báo dù không có tiến trình nào bị dừng | |
| -r, --regexp | Đọc tên dưới dạng biểu thức chính quy mở rộng | |
| -s, --signal tín hiệu | Tín hiệu gửi thay cho SIGTERM | |
| -V, --version | In thông tin phiên bản | |
| -w, --wait | Chờ đến khi mọi tiến trình đã được gửi tín hiệu biến mất | |
| -y, --younger-than thời gian | Chỉ các tiến trình bắt đầu sau thời gian đó | |
| -Z, --context mẫu | Chỉ các tiến trình có ngữ cảnh bảo mật khớp mẫu biểu thức chính quy mở rộng; ghi trước các đối số khác; có thể bỏ tên |
🔲 Trình mô phỏng lệnh killall
Trình mô phỏng dưới đây bắt đầu với danh sách bốn tiến trình xxsleep cộng thêm xxsleep-a2 của tài khoản ví dụ user1. Chạm vào các chip để so sánh dòng nào biến mất khỏi danh sách với [killall -v], [-i] và [-u]; nội dung đầu ra của killall mô phỏng theo đầu ra thu được trên máy chủ Debian 12.
4️⃣ Tín hiệu của killall
Tín hiệu cần gửi được ghi bằng tên như [-HUP] hoặc [-SIGHUP], bằng số như [-1], hoặc sau tùy chọn -s (theo tài liệu chính thức). [killall -9 tên tiến trình] gửi tín hiệu số 9 là SIGKILL. SIGKILL là tín hiệu mà tiến trình không thể bắt hay bỏ qua (theo tài liệu chính thức), nên tiến trình dừng mà không kịp dọn dẹp. Vì vậy nó được gửi khi tín hiệu mặc định SIGTERM không dừng được tiến trình.
Trên máy chủ Debian 12, khi thêm -9 cùng -v cho xxsleep-a2 được khởi động lại, xuất hiện một dòng ghi số tín hiệu 9.
killall -9 -v xxsleep-a2Killed xxsleep-a2(2173) with signal 9Chúng tôi kiểm tra tên và số tín hiệu bằng [kill -l]. killall cũng có tùy chọn -l in ra các tên tín hiệu mà nó biết.
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) SIGRTMAXKhi nhập một số, chỉ tên của tín hiệu đó xuất hiện. Số 15 mà killall gửi mặc định là TERM, còn 9 gửi bằng -9 là KILL.
kill -l 15TERMkill -l 9KILLNếu ghi tên tín hiệu không có trong danh sách, sẽ xuất hiện thông báo dạng [FOO: unknown signal; killall -l lists signals.] (theo tài liệu chính thức và nội dung của chương trình).
🔢 FAQ & nội dung đề xuất
Kiểm tra theo thời gian thực
Lệnh top trong Linux (kiểm tra mức dùng CPU và bộ nhớ)
Lệnh hiển thị theo thời gian thực mỗi tiến trình dùng bao nhiêu CPU và bộ nhớ.
Điều khiển tác vụ
Nền (Back Ground) và tiền cảnh (Fore Ground) trong Linux: điều khiển tiến trình
Cách điều khiển tác vụ để đưa lệnh xuống chạy nền rồi gọi lại lên tiền cảnh.
Tệp đang mở
[Linux] Lệnh lsof: in thông tin tệp đang được dùng
Lệnh hiển thị các tệp và socket mà tiến trình đang mở cùng với PID.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.