Lệnh killall trong Linux — Cách dừng hàng loạt tiến trình

Bạn đã bao giờ rơi vào tình huống một tiến trình "treo" cứng trên hệ thống, chiếm dụng toàn bộ tài nguyên khiến vps của bạn trở nên chậm chạp đến mức không thể thao tác được chưa nhỉ? Lúc này, việc đi tìm từng ID của tiến trình để đóng lại thật sự là một cơn ác mộng đúng không? Đừng lo lắng, vì killall chính là "cứu cánh" tuyệt vời mà mình thường xuyên sử dụng khi đảm nhận vai trò Senior System Admin để dọn dẹp hệ thống nhanh chóng. Thực tế, killall là một công cụ mạnh mẽ cho phép bạn đóng tất cả các tiến trình dựa trên tên thay vì PID. Vậy killall là gì và làm sao để làm chủ nó? Trong bài viết này, mình sẽ hướng dẫn bạn chi tiết về cách dùng killall cũng như các kỹ thuật cách dừng tiến trình hiệu quả nhất. Hãy cùng mình khám phá sức mạnh của killall Linux để quản trị máy chủ một cách chuyên nghiệp và vô cùng nhẹ nhàng nhé!

Cần chuẩn bị gì trước khi dùng lệnh killall?

  • Quyền người dùng: Yêu cầu quyền sudo hoặc quyền root nếu muốn dừng các tiến trình không thuộc sở hữu của người dùng hiện tại.
  • Hệ điều hành hỗ trợ: Hoạt động trên hầu hết các bản phân phối Linux (Ubuntu, Debian, CentOS, Fedora, Arch Linux) và các hệ thống Unix-like khác.
  • Gói phần mềm bổ trợ: Lệnh killall thường nằm trong gói procps. Nếu hệ thống chưa có, hãy cài đặt bằng lệnh sau:
    • Ubuntu/Debian: sudo apt update && sudo apt install procps
    • CentOS/RHEL: sudo yum install procps-ng
    • Arch Linux: sudo pacman -S procps-ng

Cú pháp lệnh killall là gì?

Lệnh killall hỗ trợ các dạng cú pháp sau trên hệ thống Linux/Unix:

killall [OPTIONS] NAME [PID...]
killall [OPTIONS] -u USER [PID...]
killall [OPTIONS] -g GROUP [PID...]

Các tùy chọn của lệnh killall là gì?

Lệnh killall cung cấp nhiều tùy chọn để kiểm soát cách gửi tín hiệu đến các tiến trình, bao gồm việc chỉ định loại tín hiệu, xác nhận trước khi kết thúc, và lọc tiến trình theo điều kiện cụ thể.

Tùy chọn ngắn Tùy chọn dài Mô tả
-e --exact killall -e yêu cầu tên tiến trình phải khớp chính xác, không áp dụng các quy tắc khớp đuôi tên.
-I --ignore-case killall -I làm cho việc khớp tên tiến trình không phân biệt chữ hoa chữ thường.
-g --process-group killall -g kết thúc toàn bộ nhóm tiến trình thay vì chỉ các tiến trình riêng lẻ.
-i --interactive killall -i yêu cầu xác nhận từ người dùng trước khi kết thúc mỗi tiến trình.
-l --list killall -l hiển thị danh sách tất cả các tín hiệu có sẵn mà có thể gửi tới tiến trình.
-q --quiet killall -q chỉ in ra thông báo lỗi, loại bỏ các thông báo thành công.
-r --regexp killall -r xử lý tên tiến trình dưới dạng biểu thức chính quy thay vì chuỗi thường.
-s --signal killall -s SIGNAL chỉ định loại tín hiệu cần gửi, mặc định là SIGTERM nếu không chỉ định.
-u --user killall -u USERNAME chỉ kết thúc các tiến trình thuộc về người dùng được chỉ định.
-v --verbose killall -v in ra thông tin chi tiết về các tiến trình đã được kết thúc.
-w --wait killall -w chờ đợi cho đến khi tất cả tiến trình được chỉ định đã kết thúc trước khi trả về.
-y --younger-than killall -y TIME chỉ kết thúc các tiến trình được tạo sau thời gian được chỉ định.
-o --older-than killall -o TIME chỉ kết thúc các tiến trình được tạo trước thời gian được chỉ định.
-Z --context killall -Z CONTEXT chỉ kết thúc các tiến trình khớp với ngữ cảnh bảo mật SELinux được chỉ định.

xem thêm: Process Management

Lệnh killall được sử dụng như thế nào trong thực tế?

Các ví dụ dưới đây mô phỏng các tình huống xử lý tiến trình thường gặp của quản trị viên hệ thống trong môi trường làm việc thực tế.

killall là gì? [Dừng tất cả tiến trình theo tên]

$ killall firefox

Lệnh sẽ gửi tín hiệu SIGTERM đến tất cả các tiến trình có tên là firefox. Trong thực tế, cách này nhanh hơn việc tìm từng PID để tiêu diệt khi một ứng dụng bị treo nhiều cửa sổ.

killall -9 là gì? [Buộc dừng tiến trình ngay lập tức]

$ killall -9 nginx
nginx: [1234] received SIGKILL

Tham số -9 gửi tín hiệu SIGKILL để ép buộc tiến trình dừng ngay lập tức mà không chờ xử lý dữ liệu dở dang. Trên môi trường production, chỉ sử dụng tùy chọn này khi tiến trình không phản hồi với tín hiệu mặc định để tránh lỗi corrupt dữ liệu.

killall -u là gì? [Dừng tiến trình của một người dùng cụ thể]

$ killall -u developer apache2
apache2: [5678] received SIGTERM

Lệnh cho phép bạn dừng tất cả các tiến trình của dịch vụ apache2 thuộc về người dùng có tên là developer. Đây là kỹ thuật hữu ích khi cần dọn dẹp tài nguyên của một user cụ thể trên máy chủ dùng chung.

killall -v là gì? [Hiển thị chi tiết quá trình dừng]

$ killall -v python3
python3 (1024): killed
python3 (1025): killed

Tham số -v (verbose) cung cấp thông tin xác nhận về các PID đã được xử lý thành công. Trong các kịch bản kiểm tra hệ thống, tùy chọn này giúp xác nhận chính xác số lượng tiến trình đã bị đóng.

killall kết hợp với grep là gì? [Tự động hóa việc lọc và dừng tiến trình]

$ ps aux | grep php | awk '{print $2}' | xargs killall php

Chuỗi lệnh này kết hợp pipe để lọc danh sách tiến trình và truyền vào killall nhằm tối ưu hóa việc dọn dẹp hàng loạt. Trong script automation, phương pháp này giúp quản lý các tiến trình con hoặc các tiến trình có tên biến động một cách hiệu quả.

Lệnh killall gặp lỗi không thể dừng tiến trình như thế nào?

Dưới đây là các trường hợp thực tế mà người dùng thường gặp phải khi sử dụng lệnh killall để quản lý tiến trình trong hệ thống Linux.

Không tìm thấy tiến trình với tên được cung cấp

killall firefox
killall: attempt to send signal 15 to non-existent process

Lỗi xảy ra khi tên tiến trình không khớp chính xác với bất kỳ tiến trình nào đang chạy trong hệ thống.

Không có quyền hạn để gửi tín hiệu đến tiến trình

killall apache2
ERROR: failed to send signal 15 to apache2 (pid 1234): Operation not permitted

Lỗi này xuất hiện khi bạn cố gắng dừng một tiến trình thuộc về người dùng khác hoặc tiến trình hệ thống mà không có quyền root.

Sử dụng sai tên tiến trình do phân biệt chữ hoa chữ thường

killall Firefox
killall: attempt to send signal 15 to non-existent process

Lệnh killall mặc định phân biệt chữ hoa và chữ thường, do đó việc viết sai định dạng sẽ khiến lệnh không tìm thấy mục tiêu.

Tiến trình không phản hồi với tín hiệu mặc định (SIGTERM)

killall -9 chrome
[Không có output, nhưng tiến trình vẫn tồn tại trong top/ps]

Trong một số trường hợp tiến trình bị treo ở trạng thái "Uninterruptible sleep" (D state), ngay cả tín hiệu mạnh nhất là SIGKILL cũng không thể dừng được tiến trình.

Quy trình xử lý tiến trình lỗi bằng killall trong quản trị hệ thống Linux?

Trong quá trình vận hành server, khi một dịch vụ hoặc ứng dụng bị treo gây lãng phí tài nguyên, các quản trị viên cần thực hiện quy trình dừng ứng dụng để khởi động lại.

Bước 1: Xác định tên chính xác của tiến trình đang chạy

ps aux | grep nginx
root      1234  0.0  0.1  12345  6789 ?        Ss   10:00   0:00 nginx

Sử dụng lệnh ps để liệt kê các tiến trình đang hoạt động nhằm tìm ra tên chính xác của dịch vụ cần xử lý.

Bước 2: Dừng toàn bộ các tiến trình theo tên bằng killall

sudo killall nginx

Lệnh killall gửi tín hiệu kết thúc đến tất cả các tiến trình có tên là nginx đang chạy trên hệ thống.

Bước 3: Kiểm tra lại trạng thái hệ thống để đảm bảo tiến trình đã dừng

pgrep nginx

Sử dụng pgrep để xác nhận không còn ID tiến trình nào của nginx tồn tại trong danh sách quản lý của hệ điều hành.

Việc sử dụng lệnh killall trên môi trường VPS đòi hỏi sự chính xác về tên tiến trình để tránh dừng nhầm các dịch vụ hệ thống. Khi thực hiện killall nginx trên một VPS đang chạy web server, tất cả các tiến trình có tên nginx sẽ bị chấm dứt ngay lập tức, dẫn đến tình trạng gián đoạn dịch vụ tạm thời. Trong các trường hợp cấu hình sai tên tiến trình, lệnh sẽ không trả về thông báo lỗi cụ thể mà chỉ thông báo không tìm thấy tiến trình. Việc sử dụng tham số -r cho phép tìm kiếm theo biểu thức chính quy, giúp xử lý các nhóm tiến trình có tên tương tự nhau trên VPS. Người quản trị cần kiểm tra kỹ danh sách tiến trình bằng lệnh ps aux trước khi thực hiện killall để đảm bảo tính ổn định của hệ thống.

Những câu hỏi thường gặp về lệnh killall?

Dưới đây là các tình huống phổ biến mà người dùng thường gặp phải khi sử dụng lệnh killall để quản lý tiến trình.

Làm thế nào để dừng tất cả các tiến trình có cùng tên?

Lệnh killall cho phép bạn gửi tín hiệu kết thúc đến tất cả các tiến trình đang chạy có tên khớp với tham số cung cấp.

killall firefox

Làm sao để buộc dừng một tiến trình khi nó không phản hồi?

Trong trường hợp tiến trình bị treo, bạn có thể sử dụng tùy chọn -9 để gửi tín hiệu SIGKILL, buộc hệ thống dừng tiến trình ngay lập tức.

killall -9 vlc

Làm thế nào để kiểm tra các tiến trình sẽ bị ảnh hưởng trước khi thực hiện?

Sử dụng tùy chọn -i để lệnh yêu cầu xác nhận trước khi gửi tín hiệu đến từng tiến trình, giúp tránh nhầm lẫn.

killall -i chrome

Kill chrome (pid 1234)? (y/N) y

Làm thế nào để chỉ dừng các tiến trình của một người dùng cụ thể?

Bạn có thể kết hợp tùy chọn -u để giới hạn phạm vi tác động của lệnh chỉ trong các tiến trình thuộc về một User nhất định.

killall -u username nginx

Làm thế nào để gửi một tín hiệu tùy chỉnh thay vì tín hiệu mặc định?

Bạn có thể sử dụng tùy chọn -s để chỉ định một tín hiệu cụ thể (ví dụ: SIGHUP để tải lại cấu hình) thay vì SIGTERM mặc định.

killall -s HUP apache2

Lệnh killall có phân biệt chữ hoa và chữ thường không?

killall -v [TÊN_TIẾN_TRÌNH]

Lệnh sẽ báo lỗi nếu tên tiến trình không khớp chính xác về mặt chữ hoa/chữ thường.

Lệnh killall là một công cụ mạnh mẽ giúp bạn chấm dứt các tiến trình đang chạy dựa trên tên thay vì ID của chúng. Bạn có thể vô cùng dễ dàng kiểm soát hệ thống bằng cách sử dụng tham số -9 để buộc dừng ngay lập tức các ứng dụng bị treo, hoặc dùng tham sơ -u để dọn dẹp tất cả tiến trình của một người dùng cụ thể, đúng không nhỉ? Việc làm chủ được công cụ này chắc chắn sẽ giúp quá trình quản trị Linux của bạn trở nên nhanh chóng và hiệu quả hơn rất nhiều. Chúc bạn thành công!