Mục đích của tùy chọn -9 trong lệnh kill là gì?


Câu trả lời:


28

Trang hướng dẫn sử dụng Ubuntu để killgiải thích mục đích của việc -9chuyển đổi (phải thừa nhận theo cách khá khó hiểu):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Đây là những gì một người đàn ông khác nói.

Lệnh killgửi tín hiệu được chỉ định đến quy trình hoặc nhóm quy trình được chỉ định. Nếu không có tín hiệu được chỉ định, TERMtín hiệu được gửi. Các TERMtín hiệu sẽ giết các quy trình mà không bắt tín hiệu này. Đối với các quá trình khác, có thể cần phải sử dụng tín hiệu KILL( 9), vì tín hiệu này không thể bị bắt.


Do đó, sử dụng công -9tắc đảm bảo rằng quá trình này bị giết một cách hiệu quả. Mặc dù một quá trình đóng băng hoặc không phản hồi có thể không đáp ứng với TERM tín hiệu đơn giản , nó sẽ chết khi gửi KILLtín hiệu.


40

Lệnh kill sẽ gửi tín hiệu được xác định đến một quá trình với một danh tính nhất định (PID):

kill -<signal> <pid>

Tất nhiên chúng ta chỉ có thể giết các tiến trình chúng ta sở hữu, trong khi root có thể giết tất cả các tiến trình. Xem Wikipedia để có một bản tóm tắt tốt đẹp về các tín hiệu điện toán.

Tín hiệu killcó thể gửi được liệt kê trong trang . Tín hiệu có thể được thể hiện bằng tên hoặc bằng số. Nếu không có tín hiệu nào được đưa ra tín hiệu mặc định 15 resp. TERMĐược sử dụng.

Do đó, tất cả ba lệnh dưới đây giống hệt nhau:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Sự khác biệt giữa SIGTERMSIGKILLlà cách ứng dụng có thể hoạt động trên tín hiệu:

  • TERM: một ứng dụng sẽ có thể chấm dứt, tức là chạy đúng thói quen tắt máy.
  • KILL: các ứng dụng bị dừng và bị giết ngay lập tức (điều này có thể dẫn đến mất dữ liệu hoặc tăng apport để báo cáo sự cố được cho là trong một số trường hợp).

16

Lưu ý rằng tất cả những điều sau đây là đồng nghĩa:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Thật đáng để chỉ ra rằng trong thế giới xử lý tín hiệu, SIGKILL là một trong số ít những cái duy nhất được xử lý bởi hệ điều hành chứ không phải chương trình. Khi bạn chạy kill -9, bạn không yêu cầu ứng dụng tự chấm dứt, thay vào đó bạn đang bảo HĐH ngừng chạy chương trình, bất kể chương trình đang làm gì.

Sau khi SIGKILL được gửi, chương trình sẽ ngay lập tức bị dừng. Nếu bất kỳ cuộc gọi kernel nào đang chạy (ví dụ File IO) thay mặt cho chương trình, các cuộc gọi đó có thể hoặc không thể tiếp tục cho đến khi chúng kết thúc, tùy thuộc vào cuộc gọi, nhưng bản thân chương trình sẽ không chạy nữa. Lưu ý rằng bắt nguồn từ công việc hoặc nhiệm vụ chạy theo một trình gỡ lỗi có thể hành xử khác nhau ở đây.

Tín hiệu khác không thể bị chặn là SIGSTOP có hiệu ứng tương tự, nhưng thay vào đó đóng băng chương trình; bạn có thể gửi SIGCONT sau để tiếp tục. Hành vi này hoàn toàn do HĐH kiểm soát và chương trình không nhận được bất kỳ thông báo trước nào.

Tất cả các tín hiệu khác được gửi đến chương trình; nó có thể xử lý chúng tuy nhiên nó chọn hoặc nếu nó bỏ qua tín hiệu thì một hành vi mặc định được tuân theo.

Dưới đây là một vài tín hiệu hữu ích mà bạn có thể thấy mình đang gửi đến một quy trình:

  • SIGHUP - hangup
    Báo cho chương trình rằng người dùng bị ngắt kết nối (ví dụ: phiên SSH hoặc cửa sổ đầu cuối đã bị đóng).
    Thường thì tắt chương trình một cách duyên dáng.
  • SIGINT - Ngắt
    gửi khi bạn nhấn CTRL+ C
    Thường có nghĩa là "dừng những gì bạn đang làm" - có thể hoặc không thể giết chương trình
  • SIGTERM - chấm dứt
    Mặc định được gửi bởi killkillall.
    Thường kết thúc chương trình ... đôi khi sau khi chương trình kết thúc mọi việc đang làm.
  • SIGSTOP - dừng
    Gửi khi bạn nhấn CTRL+ Z
    Tạm dừng chương trình, đã thảo luận ở trên
  • SIGPIPE - đường ống đã đóng
    Cho biết chương trình đường ống đã đóng. Thường chấm dứt chương trình.
    Ví dụ cat /etc/passwd | head -n1sẽ gửi SIGPIPE đến catquy trình sau khi dòng đầu tiên được in, gây ra catchấm dứt trước khi hoàn thành toàn bộ tệp.

Mặc dù tất cả các tín hiệu này xảy ra "một cách tự nhiên" trong cài đặt riêng của chúng, bạn có thể sử dụng tín hiệu để giả mạo một điều kiện để đạt được kết quả mong muốn.

Ví dụ: nếu bạn muốn chấm dứt phiên SSH của ai đó, bạn có thể chỉ cần giết quá trình, nhưng bằng cách đó, bạn sẽ ngăn không cho cập nhật tệp LỊCH SỬ, điều này có thể quan trọng vì lý do bảo mật. Nhưng thay vào đó, nếu bạn gửi nó SIGHUP , thì quá trình sẽ cho rằng kết nối đã chết và sẽ thực hiện việc dọn dẹp tiêu chuẩn.


Ctrl + \ gửi SIGQUIT, trong đó hành động mặc định là kết xuất lõi và chấm dứt. Điều này có thể được sử dụng nếu một chương trình đang làm gì đó rất sai, bạn cần dừng nó ngay lập tức và muốn có thể gỡ lỗi nó sau.
Simon Richter

@SimonRichter Ồ, bạn nói đúng. đã sửa.
tylerl

6

kill -9 Ý nghĩa: Quá trình sẽ bị giết bởi kernel; tín hiệu này không thể bỏ qua. 9 có nghĩa là tín hiệu KILL không thể bắt hoặc không thể bắt được

Sử dụng: SIGKILL singal

Kill Nghĩa: Lệnh kill không có tín hiệu nào vượt qua tín hiệu 15, kết thúc quá trình theo cách thông thường.

Sử dụng: Tín hiệu SIGTERM , có thể được xử lý bởi các lập trình viên

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.