Buộc thoát khỏi các quy trình hoạt động sai bằng các lệnh Linux này
Để giải thích ý nghĩa của 'Process' bằng những từ đơn giản nhất là nó là một phiên bản đang chạy của bất kỳ ứng dụng hoặc chương trình nào trên hệ thống của bạn. Bạn có thể đang chạy nhiều ứng dụng đồng thời như duyệt web, nghe nhạc làm việc trên thiết bị đầu cuối của bạn, v.v. Có nhiều quy trình nền liên quan đến các ứng dụng này do người dùng chạy.
Mỗi ứng dụng hoặc một chương trình chạy trên hệ thống của bạn sẽ tạo ra nhiều quy trình được liên kết với ứng dụng duy nhất của bạn. Đôi khi đây có thể là một vấn đề và loại bỏ các quy trình này là lựa chọn duy nhất mà bạn có.
‘Killing’ một quy trình là một tùy chọn hữu ích mà Linux cung cấp cho bạn để dừng các quy trình đang diễn ra, có thể là quy trình nền trước hoặc quy trình nền. Trong bài viết này, chúng ta sẽ xem xét các lệnh như giết
, pkill
và killall
buộc thoát khỏi bất kỳ quá trình nào trên hệ thống.
Tại sao phải giết một Quy trình?
Hiểu khái niệm về việc giết một quy trình là điều quan trọng trước khi chuyển sang phần hướng dẫn này. Giết chóc có vẻ là một cách rất tàn bạo để diễn đạt khái niệm này, nhưng nghĩa bóng của nó là hủy bỏ một cách cưỡng bức một quá trình.
Bây giờ, tại sao lại hủy bỏ hoặc bỏ một quá trình đang diễn ra? Khi nhiều quy trình đang chạy trong nền, tất cả hoặc một vài quy trình trong số đó có thể hoạt động sai và có thể khiến hệ thống của bạn hoạt động sai. Điều này làm trì hoãn các tác vụ đang diễn ra của bạn vì quá trình bị trục trặc có thể đóng băng hệ thống của bạn trong một thời gian.
Đôi khi, thoát khỏi tất cả các quy trình hoạt động sai dường như là lựa chọn duy nhất để khôi phục trạng thái bình thường trên hệ thống của bạn. Linux cho phép bạn giết một quy trình bằng cách sử dụng pid
hoặc tên quy trình.
Sử dụng pgrep
yêu cầu
Hầu hết người dùng Linux đều quen thuộc với grep
yêu cầu. Các pgrep
lệnh có thể được sử dụng trên các dòng tương tự của grep
.
pgrep
khi được sử dụng, hiển thị pid
của tiến trình đang chạy như được chỉ định trong lệnh. Lệnh này sẽ tỏ ra rất hữu ích khi sử dụng pkill
yêu cầu.
Cú pháp chung:
pgrep [tùy chọn] [mẫu]
Các tùy chọn quan trọng có sẵn với pgrep
yêu cầu
Lựa chọn | Sự miêu tả |
-u | liệt kê id quy trình do một người dùng cụ thể sở hữu |
-C | đếm số lượng quy trình phù hợp |
-TÔI | chỉ liệt kê tên quy trình |
-Một | liệt kê đường dẫn đầy đủ của tên quy trình |
Hãy để chúng tôi chứng minh việc sử dụng pgrep
lệnh bằng cách sử dụng một ví dụ.
pgrep -u gaurav gnome
Ở đây, chúng tôi muốn xem pids
của tiến trình gnome do người dùng ‘gaurav’ sở hữu. Lựa chọn -u
cho phép bạn liệt kê pids
của các quy trình do một người dùng cụ thể sở hữu. Trong trường hợp này, người dùng gaurav.
Đầu ra:
gaurav @ ubuntu: ~ $ pgrep -u gaurav gnome 1752 1755 1909 1922 2021 2576 4279 gaurav @ ubuntu: ~ $
Khi chúng ta tiếp tục với hướng dẫn này, pgrep
lệnh sẽ giúp chúng tôi xác nhận xem quá trình đã bị hủy hay vẫn đang chạy.
Bây giờ chúng ta hãy chuyển sang pkill
lệnh và sự thực thi của nó.
Sử dụng pkill
yêu cầu
Bạn có thể dùng pkill
lệnh trong Linux để hủy tiến trình bằng cách sử dụng tên tiến trình. Ngay cả khi bạn không biết pid
của một số quy trình, thậm chí sau đó bạn có thể hủy quy trình cụ thể đó bằng cách sử dụng pkill
yêu cầu.
Các quy trình có thể được chỉ định bằng tên đầy đủ của chúng hoặc tên một phần trong khi sử dụng pkill
yêu cầu. Ngay cả khi bạn nhập tên một phần của quá trình, pkill
lệnh sẽ khớp với tất cả các tiến trình đang chạy với tên khớp mà bạn đã nhập trong lệnh.
Cú pháp:
pkill [tùy chọn] [process_name_pattern]
Thí dụ:
Hãy để chúng tôi hiển thị các quy trình hiện đang chạy bằng cách sử dụng đứng đầu
yêu cầu. Bạn cũng có thể sử dụng ps
lệnh liệt kê các tiến trình.
đứng đầu
top - 14:24:02 up 3:12, 1 người dùng, tải trung bình: 0.29, 0.48, 0.58 Nhiệm vụ: tổng cộng 221, 1 đang chạy, 172 đang ngủ, 0 dừng, 1 zombie% Cpu: 5.6 us, 1.0 sy , 0.0 ni, 92.9 id, 0.4 wa, 0.0 hi, 0.1 si, 0.0 st KiB Mem: tổng cộng 3928240, 610456 miễn phí, 2233152 đã sử dụng, 1084632 buff / cache KiB Swap: tổng cộng 4083708, 3378884 miễn phí, 704824 đã sử dụng. 1187268 lịch phát sóng Mem PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND 4077 gaurav 20 0 3312128 673480 118360 S 19,6 17,1 15: 13,23 Nội dung web 3712 gaurav 20 0 3953008 453544 116476 S 4.0 11,5 9: 28,39 MainThread 2010 gaurav 20 0 4084232 111096 45024 S 1,7 2,8 3: 14,85 gnome-shell 1197 root 20 0 1039612 33704 22988 S 1,0 0,9 3: 04,42 Xorg 1426 couchdb 20 0 3772396 16908 2520 S 0,7 0,4 1: 50,83 chùm.smp 3288 gaurav 20 0 722480 25048 18272 S 0,7 0,6 0: 06,84 gnome-terminal- 3915 gaurav 20 0 2804900 231524 111228 S 0,7 5,9 0: 54,42 Nội dung web 4146 gaurav 20 0 3017924 245304 120604 S 0,7 6.2 2: 01,21 Nội dung web 4417 gaurav 20 0 2964208 234396 119160 S 0,7 6,0 0 : 59,90 Nội dung web 4860 gaurav 20 0 3066800 372920 132544 S 0,7 9,5 0: 48,20 Nội dung web 16007 gaurav 20 0 41944 3780 3116 R 0,7 0,1 0: 00,28 trên cùng
Sử dụng đứng đầu
lệnh sẽ hiển thị nhiều quy trình trên thiết bị đầu cuối của bạn. Hãy để chúng tôi cố gắng hiển thị quy trình với một tên cụ thể. Chúng tôi sẽ sử dụng grep
lệnh để hiển thị một tiến trình có tên khớp với chuỗi ‘mongo’.
đầu trang | grep -i mongo
Ghi chú: Ở đây, tôi đã sử dụng tùy chọn -i để làm cho tìm kiếm không phân biệt chữ hoa chữ thường.
Đầu ra của lệnh này sẽ hiển thị các quy trình phù hợp với tên ‘mongo’
1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,22 mongod 1158 mongodb 20 0 288564 4848 1320 S 1,0 0,1 1: 03,25 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,27 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,29 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,31 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,33 mongod 1158 mongodb 20 0 288564 4848 1320 S 1,0 0,1 1: 03,36 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,38 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,40 mongod 1158 mongodb 20 0 288564 4848 1320 S 1,0 0,1 1: 03,43 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,45 mongod 1158 mongodb 20 0 288564 4848 1320 S 1,0 0,1 1: 03,48 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,3 0,1 1: 03,49 mongod 1158 mongodb 20 0 288564 4848 1320 S 1,0 0,1 1: 03,52 mongod 1158 mongodb 20 0 288564 4848 1320 S 0,7 0,1 1: 03,54 mongod 1158 mongodb 20 0 288564 4848 1320 S 1,0 0,1 1: 03,57 mongod
Bây giờ, chúng ta sẽ sử dụng pkill
lệnh để giết tiến trình có tên là ‘mongo’.
pkill mongo
Lệnh này bây giờ sẽ giết quá trình mongo. Chúng tôi có thể xác nhận xem quá trình có bị buộc phải dừng lại hay không bằng cách sử dụng pgrep
lệnh hiển thị pid
của tiến trình đang chạy theo các tiêu chí do người dùng chỉ định.
gaurav @ ubuntu: ~ $ pgrep mongo gaurav @ ubuntu: ~ $
Lệnh này sẽ không trả về giá trị nào. Điều này xác nhận rằng quá trình 'mongo' hiện đã bị hủy bằng cách sử dụng pkill
yêu cầu.
Các tùy chọn thường được sử dụng với pkill
yêu cầu
Trong khi sử dụng pkill
lệnh, chúng tôi sẽ cần các tùy chọn đã đề cập để sử dụng hợp lý và dễ dàng pkill
yêu cầu.
Tùy chọn | Sự miêu tả |
-f | khớp với các đối số đầy đủ bao gồm dấu cách, dấu ngoặc kép, ký tự đặc biệt |
-u | để thông báo cho quá trình pkill khớp với quá trình đang được chạy bởi người dùng được chỉ định |
-1 | tải lại quá trình |
-9 | giết chết quá trình |
-15 | hủy bỏ một cách duyên dáng |
Hãy để chúng tôi xem thêm một ví dụ về pkill
lệnh bằng cách sử dụng -f
lựa chọn.
Có hai lệnh hiện đang thực hiện trên thiết bị đầu cuối như hình dưới đây.
ping bbc.com ping youtube.com
Cả hai quy trình đều được khởi tạo bởi ping
yêu cầu. Bây giờ, giả sử chúng ta chỉ muốn chấm dứt một quá trình “ping youtube.com” thì chúng ta phải sử dụng -f
tùy chọn với pkill
lệnh giết một tiến trình với một tên cụ thể bao gồm các khoảng trắng và dấu ngoặc kép từ tên tiến trình.
Yêu cầu:
gaurav @ ubuntu: ~ $ pkill -f "ping youtube.com" gaurav @ ubuntu: ~ $
Kết quả:
gaurav @ ubuntu: ~ $ ping youtube.com PING youtube.com (142.250.67.206) 56 (84) byte dữ liệu. 64 byte từ bom12s08-in-f14.1e100.net (142.250.67.206): icmp_seq = 1 ttl = 117 time = 30,9 ms 64 byte từ bom12s08-in-f14.1e100.net (142.250.67.206): icmp_seq = 2 ttl = 117 thời gian = 121 ms 64 byte từ bom12s08-in-f14.1e100.net (142.250.67.206): icmp_seq = 206 ttl = 117 thời gian = 86,5 ms 64 byte từ bom12s08-in-f14.1e100.net (142.250.67.206 ): icmp_seq = 207 ttl = 117 time = 105 ms Đã kết thúc gaurav @ ubuntu: ~ $
Đây, “ping youtube.com
"Quy trình hiện đã bị hủy và"ping bbc.com
”Vẫn đang chạy trên thiết bị đầu cuối.
Trong trường hợp, nếu chúng tôi đã sử dụng pkill ping
lệnh, nó sẽ giết cả hai ping
quy trình, điều không mong muốn.
Tín hiệu được sử dụng với pkill
yêu cầu
pkill
buộc một quy trình phải thoát bằng cách gửi một tín hiệu cụ thể đến quy trình đó. Có ba tín hiệu có thể xảy ra pkill
lệnh có thể gửi tới tiến trình tùy thuộc vào lệnh mà người dùng đưa ra.
Sau đây là danh sách các tín hiệu có sẵn.
Tín hiệu | Sự chỉ rõ |
1 (HÚT ) | tải lại quy trình được chỉ định |
9 (GIẾT ) | giết quá trình được chỉ định |
15 (THUẬT NGỮ ) | nhẹ nhàng dừng hoặc hủy bỏ quá trình đã chỉ định |
Đối với hướng dẫn này, chúng tôi sẽ dựa nhiều vào GIẾT
tín hiệu. Hãy cùng chúng tôi đi qua một số ví dụ để hiểu rõ hơn.
Sử dụng pgrep
lệnh để có được pid
khớp với tên apache.
gaurav @ ubuntu: ~ $ pgrep apache 1218 10402 10403 gaurav @ ubuntu: ~ $
pkill -KIll apache
HOẶC bạn cũng có thể sử dụng lệnh với các số (ví dụ: 1, 9, 15)
pkill -9 apache
Cả hai lệnh hiển thị ở trên sẽ giết apache của tiến trình. Xác nhận với pgrep
lệnh một lần nữa.
gaurav @ ubuntu: ~ $ pgrep apache gaurav @ ubuntu: ~ $
Như pgrep
lệnh không trả về kết quả đầu ra, chứng tỏ rằng quá trình apache đã bị giết.
Sự kết luận
Trong hướng dẫn này, chúng tôi đã tìm hiểu về pkill
và cách nó được sử dụng để kết thúc tiến trình bằng cách sử dụng trực tiếp tên tiến trình. Chúng tôi cũng đã tìm hiểu về pgrep
lệnh được sử dụng để tìm nạp id quy trình của quy trình được chạy bởi bất kỳ người dùng cụ thể nào. Các pgrep
lệnh cho phép chúng tôi kiểm tra chéo xem quá trình có bị giết hay không.