CodeGym /Các khóa học /Docker SELF /Kết thúc tiến trình: các lệnh `kill`, `killall`, `pkill`

Kết thúc tiến trình: các lệnh `kill`, `killall`, `pkill`

Docker SELF
Mức độ , Bài học
Có sẵn

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, killallpkill. Đừ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 killallpkill 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, killallpkill, 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, killallpkill

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, killallpkill.

  1. Xem tất cả các tiến trình sleep đang chạy bằng lệnh ps:
ps aux | grep sleep

Bạn sẽ thấy PID của từng tiến trình.

  1. Kết thúc tiến trình với PID, ví dụ 1234:
kill 1234
  1. Kết thúc tất cả các tiến trình sleep cùng một lúc:
killall sleep
  1. Chạy thêm một vài tiến trình sleep và kết thúc chúng bằng pkill:
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 killallpkill, đặ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 killpkill 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.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION