Kết thúc tiến trình: các lệnh kill
, killall
, pkill
1. Kết thúc tiến trình
Hôm nay bọn mình sẽ tiến thêm một bước nữa và học cách sử dụng các lệnh giúp kết thúc tiến trình một cách hiệu quả. Chuẩn bị đi nhé, vì sự kiên nhẫn của bạn với mấy chương trình "đơ" sẽ sớm kết thúc thôi!
Ứng dụng hay lệnh nào được chạy trong Linux đều là một tiến trình. Nhưng làm gì khi chương trình bị đơ, ngốn 100% tài nguyên CPU hay chỉ đơn giản là hoạt động không như ý? Nhiệm vụ của admin (hoặc developer) là can thiệp và kết thúc tiến trình "bất trị" này. Trong Linux, bạn có một bộ công cụ đầy đủ cho việc đó: kill
, killall
và pkill
. Đừng lo, dù tên nghe có vẻ đáng sợ, nhưng bọn mình không ở đây để phá huỷ mọi thứ. Thay vào đó, đây là một cách tinh tế để sắp xếp mọi thứ lại gọn gàng.
2. Lệnh kill
Cơ bản
Lệnh kill
kết thúc tiến trình dựa trên ID của nó (PID). PID là số nhận dạng duy nhất mà hệ thống gán cho mỗi tiến trình. Ví dụ, nếu bạn muốn kết thúc tiến trình với PID 1234, hãy sử dụng lệnh sau:
kill 1234
Linux vốn dĩ rất cởi mở, vì vậy lệnh kill
không hẳn là "ra lệnh chết đi", mà là gửi yêu cầu kết thúc. Yêu cầu này được gọi là "tín hiệu". Mặc định, kill
sẽ gửi tín hiệu SIGTERM
(15).
Tín hiệu là gì?
Linux sử dụng tín hiệu để giao tiếp với các tiến trình. Giống như bạn gửi bưu thiếp với ý định khác nhau:
SIGTERM
(15): "Làm ơn kết thúc nhé". Đây là một yêu cầu lịch sự để tiến trình dừng hoạt động.SIGKILL
(9): "Đủ rồi, giờ thì bị đuổi việc!". Kết thúc tiến trình một cách cưỡng chế.SIGHUP
(1): "Ê, tải lại cấu hình đi". Được dùng để khởi động lại một số tiến trình mà không cần dừng chúng.
Ví dụ cưỡng chế kết thúc tiến trình:
kill -9 1234
Nếu tiến trình từ chối kết thúc với SIGTERM
, bạn có thể gửi tín hiệu mạnh hơn — SIGKILL
.
Làm sao để tìm PID của tiến trình?
Để sử dụng lệnh kill
, bạn cần biết PID của tiến trình. Các lệnh quen thuộc như ps
, top
hoặc htop
sẽ giúp bạn. Ví dụ, đầu ra từ lệnh ps aux
sẽ hiển thị tất cả các tiến trình đang chạy:
ps aux | grep firefox
Lệnh này sẽ tìm tiến trình Firefox và hiển thị PID của nó.
Tiến trình đã kết thúc, bạn có thể thở phào. Nhưng nếu có nhiều tiến trình "đơ cứng" thì sao? Đây là lúc lệnh killall
và pkill
tham gia cuộc chơi.
3. Lệnh killall
Tiện lợi cho việc kết thúc hàng loạt
Lệnh killall
cho phép kết thúc tất cả các quy trình với một tên cụ thể. Bạn không cần tìm PID thủ công, mọi thứ trở nên dễ dàng hơn nhiều. Ví dụ, nếu bạn muốn đóng tất cả các phiên bản Firefox đang chạy:
killall firefox
Giống như lệnh kill
, killall
gửi tín hiệu cho các quy trình. Bạn có thể chỉ định một tín hiệu cụ thể:
killall -9 firefox
Mẹo hữu ích
Hãy cẩn thận với các lệnh kiểu killall
. Nếu bạn vô tình chỉ định một quy trình quá chung chung, ví dụ, killall python
, bạn có thể kết thúc tất cả các ứng dụng Python đang chạy, bao gồm cả các tác vụ máy chủ hoặc script quan trọng.
Các tín hiệu nào được hỗ trợ?
Đối với tất cả các lệnh kill
, killall
và pkill
, danh sách các tín hiệu có sẵn có thể được xem bằng lệnh:
kill -l
4. Lệnh pkill
Tìm tiến trình theo tên (hoặc một phần của nó)
Lệnh pkill
hoạt động tương tự như killall
, nhưng linh hoạt hơn. Nó cho phép kết thúc các tiến trình phù hợp với một mẫu nhất định. Ví dụ:
pkill fire
Lệnh sẽ kết thúc tất cả các tiến trình có chứa từ "fire" trong tên. Điều này rất tiện lợi cho các trường hợp khi tên tiến trình dài hoặc bạn chỉ biết một phần của nó.
Kết thúc các tiến trình của người dùng
Bạn có thể kết thúc các tiến trình thuộc về người dùng nhất định. Ví dụ:
pkill -u username
Điều này sẽ kết thúc tất cả các tiến trình thuộc về người dùng username
.
So sánh kill
, killall
và pkill
Lệnh | Đặc điểm |
---|---|
kill |
Kết thúc tiến trình bằng PID. Hoạt động chính xác. |
killall |
Kết thúc tất cả các tiến trình với tên được chỉ định. Tiện lợi để đóng hàng loạt. |
pkill |
Kết thúc tiến trình theo tên hoặc mẫu. Hỗ trợ các tham số bổ sung, như tên người dùng. |
5. Thực hành: kết thúc tiến trình
Hãy thử thực hiện tất cả những gì chúng ta đã học. Đầu tiên, hãy chạy một vài tiến trình sống lâu:
sleep 300 &
sleep 400 &
sleep 500 &
Các lệnh này sẽ tạo ba tiến trình nền với thời gian chờ khác nhau. Bây giờ bạn có thể thực hành với các lệnh kill
, killall
và pkill
.
- Xem tất cả các tiến trình
sleep
đang chạy bằng lệnhps
:
ps aux | grep sleep
Bạn sẽ thấy PID của từng tiến trình.
- Kết thúc tiến trình với PID, ví dụ 1234:
kill 1234
- Kết thúc tất cả các tiến trình
sleep
cùng một lúc:
killall sleep
- Chạy thêm một vài tiến trình
sleep
và kết thúc chúng bằngpkill
:
pkill sl
6. Các lỗi phổ biến và những điểm cần chú ý
Nếu bạn cố gắng kết thúc một tiến trình mà bạn không có quyền (ví dụ, tiến trình của người dùng khác), lệnh sẽ báo lỗi. Trong trường hợp này, bạn cần có quyền superuser (sudo). Ví dụ:
sudo kill 1234
Một nguồn gây nhầm lẫn khác có thể là việc sử dụng tín hiệu quá mạnh -9
. Điều này tương đương với việc rút phích cắm máy tính: hệ thống sẽ không kịp giải phóng tài nguyên hoặc lưu dữ liệu. Chỉ nên sử dụng SIGKILL
trong trường hợp thực sự cần thiết.
Hãy cẩn thận với killall
và pkill
, đặc biệt là khi bạn đang quản lý server. Việc kết thúc các tiến trình "mù quáng" có thể dẫn đến mất dữ liệu quan trọng.
Tại sao cần biết các lệnh kết thúc tiến trình?
Những lệnh này có phạm vi ứng dụng rộng, từ việc chấm dứt các ứng dụng bị treo cho đến quản lý các tiến trình server. Trong các buổi phỏng vấn, việc biết kill
và pkill
có thể là một dấu hiệu quan trọng về năng lực của bạn, đặc biệt khi nói về quản trị hệ thống hoặc làm việc với backend.
Hãy sử dụng những kiến thức này để tạo các script tự động kết thúc những tiến trình không kiểm soát được hoặc giải phóng các cổng đang sử dụng. Ví dụ, trước khi khởi chạy một server chiếm cổng 8080, bạn có thể sử dụng:
pkill -f "port 8080"
Sự linh hoạt và sức mạnh của những lệnh này khiến chúng trở thành công cụ không thể thiếu của bất kỳ chuyên gia Linux nào.
GO TO FULL VERSION