Cách sử dụng lệnh kill trong Linux để dừng tiến trình process

Trong Linux, mọi tác vụ (tasks) đều là một tiến trình (process) với mã số định danh (PID) riêng. Nhưng điều gì sẽ xảy ra khi một ứng dụng bị treo hoặc tiêu tốn quá nhiều tài nguyên? 

Lệnh kill chính là giải pháp. Đây là công cụ mạnh mẽ giúp bạn dừng ngay lập tức các tiến trình không mong muốn mà không cần khởi động lại hệ thống. Hãy cùng khám phá cách sử dụng lệnh kill để kiểm soát hệ thống Linux hiệu quả hơn.

Kill command là gì?

Lệnh "kill" là một tiện ích quan trọng cho phép người dùng gửi tín hiệu (dừng hoặc terminate) đến các tiến trình đang chạy, yêu cầu chúng thoát ra một cách lịch sự hoặc bị buộc dừng.

Lệnh kill hữu ích khi bạn cần quản lý và kiểm soát các hoạt động của các chương trình khác nhau trên hệ thống Linux của bạn, chẳng hạn như:

  • Dừng bất kỳ tiến trình tự động nào.
  • Dừng một tiến trình đã bắt đầu theo đúng ý muốn.
  • Dừng một tiến trình sử dụng quá nhiều bộ nhớ.
  • Forcefully terminate bất kỳ tiến trình nào đang chạy trong Linux.
  • Dừng một tiến trình đang chạy ở nền.

Sử dụng lệnh kill từ /usr/bin cung cấp cho bạn một số tính năng bổ sung để terminate một tiến trình theo tên tiến trình bằng cách sử dụng pkill, qui định tiến trình bằng tên của chúng.

Cách tìm Process ID hoặc tên tiến trình

Trước khi terminate một tiến trình đang chạy, rất quan trọng để xác định Process ID (PID) hoặc tên tiến trình của nó bằng cách sử dụng lệnh ps sau đây, hiển thị thông tin về tất cả các tiến trình đang chạy trên hệ thống với PID (Process ID) và thông tin khác.

$ ps -ef
List All Running Processes

Nếu bạn muốn tìm kiếm một tên tiến trình PID cụ thể, bạn có thể sử dụng lệnh grep sẽ liệt kê tất cả các tiến trình đang chạy trên hệ thống và lọc kết quả để chỉ hiển thị những tiến trình chứa thuật ngữ "mariadb".

ps -ef | grep mariadb

Hoặc bạn có thể trực tiếp tìm PID của một tiến trình bằng tên bằng cách sử dụng lệnh pgrep như được hiển thị.

pgrep mariadb
Find Process PID

Cách terminate một tiến trình trong Linux

Trước khi bạn terminate một tiến trình, hãy nghĩ về quyền truy nhập. Nếu bạn là người dùng root, bạn có thể dừng bất kỳ tiến trình nào, nhưng nếu bạn là người dùng thông thường, bạn cần thêm "sudo" trước lệnh hoặc chuyển sang quyền root bằng "su" để sử dụng lệnh terminate.

Cú pháp thông thường cho lệnh kill như sau:

kill [signal or option] PID(s)
OR
sudo kill [signal or option] PID(s)

Đối với kill command, Signal Name có thể là:

Kill Command Signals

Rõ ràng từ hành vi bên trên:

  • SIGTERM là cách mặc định và an toàn nhất để terminate một tiến trình.
  • SIGHUP là cách terminate an toàn hơn so với SIGTERM.
  • SIGKILL là cách không an toàn nhất trong số ba cách trên để terminate một tiến trình mà không lưu lại.

Trong Linux, có nhiều tín hiệu khác nhau bạn có thể sử dụng để stop, end hoặc pause tiến trình. Bạn có thể liệt kê tất cả các tín hiệu terminate khả dụng kèm theo tên và số tương ứng bằng lệnh sau, sẽ liệt kê:

kill -l

Mặc dù có nhiều tín hiệu khả dụng, nhưng trong hầu hết các trường hợp, chúng ta chỉ sử dụng SIGKILL (9) và SIGTERM (15).

List Kill Command Signals

Để terminate một tiến trình, chúng ta cần biết Process ID của tiến trình. Một tiến trình là một trường hợp của một chương trình. Mỗi khi một chương trình bắt đầu, tự động xác định một PID duy nhất cho tiến trình đó.

Mỗi tiến trình trong Linux có một pid. Quá trình đầu tiên bắt đầu khi Hệ thống Linux được khởi động là tiến trình khởi tạo (init process), do đó nó được gán giá trị là '1' trong hầu hết các trường hợp.

Init là quy trình master và không thể terminate theo cách này, điều này đảm bảo quy trình master không bị terminate theo sai sót. Quy trình Init quyết định và cho phép bản thân mình bị terminate, trong khi terminate chỉ là một yêu cầu để tắt hệ thống.

Trước khi tiến hành và thực hiện một lệnh kill, có một số điểm quan trọng để lưu ý:

  • Người dùng có thể terminate tất cả các tiến trình của mình.
  • Người dùng không thể terminate được các tiến trình của người dùng khác.
  • Người dùng không thể terminate các tiến trình hệ thống đang sử dụng.
  • Người dùng root có thể terminate tiến trình cấp hệ thống và tiến trình của bất kỳ người dùng nào.

Để terminate tiến trình mariadb với PID, sử dụng lệnh kill như được hiển thị.

kill -9 3383

Lệnh trên sẽ terminate tiến trình có pid=3383, trong đó PID là giá trị số của tiến trình.

Một cách khác để thực hiện chức năng tương tự có thể được viết lại như sau.

kill -SIGTERM 3383

Tương tự, 'kill -9 PID' tương đương với 'kill -SIGKILL PID' và ngược lại.

Để xác nhận tiến trình đã kết thúc, bạn có thể sử dụng lệnh ps.

ps -ef | grep mariadb
Kill Linux Process with PID

Cách terminate nhiều tiến trình trong Linux

Để terminate nhiều tiến trình trong Linux bằng cách sử dụng PID (Process ID) của chúng, bạn có thể sử dụng lệnh kill kết hợp với số PID tương ứng.

Trước tiên, xác định PID của các tiến trình bạn muốn terminate bằng lệnh ps hoặc pgrep.

ps aux | grep apache2
OR
pgrep apache2

Sau khi có PID, sử dụng lệnh kill để terminate chúng.

kill -9 PID1 PID2 PID3

Cách terminate một tiến trình trong Linux bằng tên tiến trình

Để terminate một tiến trình bằng tên tiến trình, chúng ta sẽ sử dụng lệnh pkill, đây là một phiên bản của lệnh kill cho phép bạn chỉ định tên tiến trình hoặc một mẫu để tìm một tiến trình.

Bạn phải biết tên tiến trình trước khi terminate, và nhập sai tên tiến trình có thể gây rối.

pkill mysqld

Nếu một tiến trình có quá nhiều phiên bản và nhiều tiến trình con, chúng ta có lệnh 'killall' có thể lấy tên tiến trình làm đối số thay vì số tiến trình.

Cách terminate một tiến trình trong Linux bằng lệnh Killall

Sự khác biệt chính giữa killall và kill là killall có thể terminate một tiến trình bằng tên của nó, trong khi lệnh kill phụ thuộc vào Process ID (pid).

Để terminate tất cả các phiên bản mysql cùng với các tiến trình con, sử dụng lệnh sau.

killall mysqld
OR
pkill mysqld

Bạn luôn có thể xác minh trạng thái của tiến trình nếu nó đang chạy hay không, bằng cách sử dụng một trong các lệnh dưới đây.

systemctl status mysql
pgrep mysql
ps -aux | grep mysql

Các công cụ giám sát hệ thống đồ họa Linux như htop hoặc gnome-system-monitor cung cấp giao diện người dùng thân thiện để tìm và terminate các tiến trình.

Đó là tất cả về chủ đề này từ phía tôi. Tôi sẽ trở lại sớm với một chủ đề thú vị và có ích khác. Cho đến khi đó, hãy tiếp tục đồng hành với Tecmint và chú ý đến sức khỏe của bạn. Đừng quên chia sẻ phản hồi có giá trị của bạn trong phần bình luận.

Câu hỏi thường gặp (FAQ)

1. Lệnh kill khác gì so với pkillkillall?

kill yêu cầu PID cụ thể, trong khi pkill có thể tìm tiến trình theo tên, và killall sẽ dừng tất cả các tiến trình có cùng tên.

2. Làm thế nào để tìm PID của một tiến trình?

Bạn có thể dùng lệnh:

  • ps aux | grep <tên tiến trình>
  • pgrep <tên tiến trình>

3. Nếu kill không hoạt động thì sao?

Thử dùng kill -9 <PID> để ép buộc tiến trình dừng. Nếu vẫn không được, hãy kiểm tra quyền của bạn hoặc sử dụng sudo.

4. kill -9 có an toàn không?

Không nên dùng thường xuyên vì nó dừng tiến trình ngay lập tức, có thể gây mất dữ liệu. Hãy thử kill -15 trước để cho tiến trình thời gian tự thoát.

5. Làm sao để dừng tất cả tiến trình của một user?

Sử dụng pkill -u <username> hoặc killall -u <username>.