giết -9 chương trình nhưng chúng vẫn bị treo


11

Tôi đã cố gắng giết tất cả các công việc nền của mình gửi trước đó trong KUbfox

kill -9 $(jobs -p)

Mặc dù lệnh này ngay lập tức đưa ra thông điệp như

[1] Giết chết myjob1

[2] Giết chết myjob2

Tôi vẫn có thể thấy các quy trình của họ bị treo ở đầu ra và việc sử dụng CPU và bộ nhớ không bị thay đổi trong đầu ra của thời gian hoạt động và miễn phí.

Vì vậy, tôi đoán rằng tôi đã không giết họ đúng cách. Ai đó có thể vui lòng giải thích những gì đang xảy ra với tôi và tôi sẽ làm gì?

Tôi thấy rằng ở trên cùng, nếu loại k và nhập vào PID, tôi có thể giết từng tiến trình một. SO này khác với lệnh kill?

Tôi cũng tìm thấy ở đâu đó trực tuyến http://www.ruhr.de/home/smallo/award.html về việc không khuyến cáo giết -9

Sử dụng vô dụng thư mẫu Kill -9

(Trích lời gớm ghiếc)

Không không không. Đừng dùng kill -9.

Nó không cho quá trình một cơ hội để làm sạch:

1) tắt kết nối ổ cắm

2) làm sạch các tập tin tạm thời

3) thông báo cho con của nó rằng nó sẽ biến mất

4) thiết lập lại các đặc điểm đầu cuối của nó

Vân vân và vân vân.

Nói chung, gửi 15 và đợi một hoặc hai giây, và nếu điều đó không hiệu quả, hãy gửi 2 và nếu điều đó không hiệu quả, hãy gửi 1. Nếu không, hãy BỎ L BIN B BINNG CÁCH vì chương trình hoạt động kém!

Đừng dùng kill -9. Đừng mang ra máy gặt đập liên hợp chỉ để dọn dẹp chậu hoa.

Điều này có đúng không? "Gửi 15", "gửi 2" và "gửi 1" nghĩa là gì? Có phải chúng tự ra lệnh hoặc "kill -15 PID", "kill -2 PID" và "kill -1 PID"?

Cảm ơn và trân trọng!


Loại bỏ tệp nhị phân (tệp thực thi) sẽ không tự hủy quá trình. Hệ thống tệp sẽ biết quy trình đang sử dụng tệp đó và để quá trình "xem" tệp ngay cả sau khi bạn xóa tệp.
Jeppe Stig Nielsen

Câu trả lời:


9

Quá trình của bạn có thể đã chết nhưng nó vẫn hiển thị trong mục quy trình vì đây là "quy trình zombie". Khi một tiến trình con kết thúc và biến mất hoàn toàn (ngoại trừ mục nhập bảng quy trình của nó) và cha mẹ sẽ không thể lấy trạng thái kết thúc của nó (thông qua bất kỳ chức năng chờ nào), nó được gọi là zombie ... Giết (tín hiệu thông qua) một zombie sẽ không làm việc vì nó đã bị chấm dứt Những gì bạn cần làm là tìm ra quy trình cha mẹ của nó và tiêu diệt sạch sẽ, do đó không sử dụng kill - 9

Đây là hai bước đơn giản để tiêu diệt zombie ...

  1. nếu cha mẹ vẫn còn sống, hãy cố gắng giết nó (hoặc SIGHUP là tất cả những gì bạn cần)
  2. nếu số 1 không thành công, có một lỗi trong kernel .... khởi động lại là bạn của bạn và sửa lỗi đó: ->

Tôi gửi công việc của mình trong dòng lệnh và trong nền, cha mẹ của họ sẽ là gì? Và làm thế nào tôi có thể tìm thấy cha mẹ của họ nếu có?
Tim

Sử dụng -fcờ để ps để xem các tiến trình cha.
Jack M.

6

xem man killđịnh nghĩa của các tín hiệu khác nhau có sẵn, nhưng có.

  • 15 là SIGTERM và yêu cầu một chương trình để thoát.
  • 2 là SIGINT và tương đương với Control-C
  • 1 là SIGHUP và chỉ ra rằng thiết bị đầu cuối đã gác máy.

Chúng thông báo cho một quá trình rằng người dùng đã "hoàn thành" quy trình, mặc dù chúng chỉ ra một số lý do khác nhau. HƯỚNG DẪN có thể được hiểu là "hoàn thành nhiệm vụ hiện tại, nhưng sau đó thoát ra; không bắt đầu một việc khác", SIGINT có nghĩa là "từ bỏ những gì bạn đang thực hiện và thoát ", SIGHUP chỉ có nghĩa là không còn ai nghe nữa (quy trình máy chủ có thể phản ứng hợp pháp với SIGHUP bằng cách ngừng đầu ra giao diện điều khiển và tiếp tục chạy).

  • 9 là SIGKILL và đặc biệt ở chỗ nó là quy trình duy nhất mà quy trình không thể nắm bắt và xử lý nội bộ. Nó chỉ đơn giản là kết quả là kernel không bao giờ quay lại kiểm soát tiến trình, khiến nó không có cơ hội để dọn sạch.

ở trên cùng, nếu gõ k và nhập vào PID, tôi có thể giết từng tiến trình một. Vì vậy, điều này có tương đương với một số tùy chọn cho lệnh kill?
Tim

Vâng, top chỉ gửi một tín hiệu cho quá trình, giống như kill. AFAICT, tín hiệu mặc định mà các ứng dụng hàng đầu sử dụng là 15 (SIGTERM).
puetzk


1

Nó có nghĩa là gõ "kill -1" hoặc "kill -15" thay vì gõ "kill -9". Kill -9 là một viên đạn khó nhằn trong đầu của bất kỳ quá trình đang chạy nào, giết chết nó trong trạng thái bẩn có thể gây rò rỉ bộ nhớ, blah blah.

Nếu bạn đang gõ kill -9 và nó không hoạt động, thì tôi sẽ đảm bảo rằng quy trình sẽ không được xử lý và bạn có quyền giết quy trình đó.


Làm thế nào bạn sẽ nhìn để đảm bảo rằng quá trình không được đánh giá cao? Vì tôi sở hữu các quy trình, tôi có được phép giết quy trình đó không?
Tim

Nó nên có một số quá trình khác nhau nếu có. Vì vậy, nếu bạn thực hiện ps -Al và bạn thấy processA, sau đó bạn giết -9 processA, sau đó thực hiện ps -Al và có VẪN một processA trong hàng đợi xử lý, hãy đảm bảo đó là SAME processA chứ không phải là một process mới.
Satanicpuppy

Và nó sẽ cho bạn biết nếu bạn không được phép giết quá trình.
Satanicpuppy

0

Tín hiệu 9 là SIGKILL. Gửi một SIGKILL là yêu cầu HĐH ngay lập tức tiêu diệt quy trình, không có câu hỏi nào được hỏi. Quá trình không được thông báo trước và không có cơ hội để làm sạch sau đó.

Tín hiệu 15 là SIGTERM. Gửi một SIGTERM là yêu cầu HĐH yêu cầu quá trình tự tắt.

SIGKILL có thể bị bỏ qua nếu HĐH nghĩ rằng quy trình đang thực hiện IO hoặc nếu đó là Zombie (Một quá trình con có cha mẹ không dọn dẹp sau đó).

SIGTERM có thể bị ứng dụng bỏ qua, nhưng các ứng dụng không nên làm điều này, vì các hệ điều hành gửi SIGTERM trong khi tắt máy, ngay sau đó là SIGKILL nếu một chương trình vẫn đang chạy.

Lưu ý: Dòng lệnh killluôn yêu cầu HĐH gửi tín hiệu đến ứng dụng, điều này có thể hoặc không thể thực hiện dựa trên người sở hữu quy trình, v.v ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.