Đầu tiên, điều này không cụ thể đối với bash. ATT ksh, dash và zsh hoạt động theo cùng một cách: họ bỏ qua SIGTERM và SIGQUIT trong phiên bản dòng lệnh; đối với mksh, nó cũng không bỏ nhưng đối xử với họ như SIGINT.
Cả hướng dẫn sử dụng ksh và hướng dẫn bash đều biện minh cho việc bỏ qua SIGTERM trong các điều khoản sau:
vì vậy mà kill 0
không giết được vỏ tương tác
kill 0
Giết tất cả các quy trình trong nhóm quy trình mà shell nằm trong. Tóm lại, nhóm quy trình bao gồm tất cả các quy trình đang chạy ở nền trước trên thiết bị đầu cuối hoặc tất cả các quy trình trong nền hoặc công việc bị đình chỉ.
Chính xác hơn, đây là những gì xảy ra trong vỏ hiện đại với kiểm soát công việc . Trong các shell như vậy, kill 0
sẽ không hữu ích, vì shell sẽ nằm trong một nhóm quy trình của riêng nó. Các shell cũ hơn (hoặc các shell hiện đại sau set +m
) không tạo các nhóm quy trình cho các lệnh nền. Vì vậy, bạn có thể sử dụng lệnh kill 0
để giết tất cả các lệnh nền mà không bị đăng xuất .² Do đó, kill 0
cơ sở lý luận trông giống như một lệnh cũ không còn hợp lý ngày nay mà vẫn giữ được tính tương thích ngược.
Tuy nhiên, có những tình huống tương tự khác trong đó làm cho vỏ miễn dịch là hữu ích. Hãy xem xét trường hợp bạn có các quy trình ăn cắp một thiết bị đầu cuối và bạn muốn giết chúng mà không cần đăng xuất. Nhiều hệ thống có một công cụ pkill
cho phép bạn tiêu diệt các tiến trình đang chạy trên thiết bị đầu cuối. Bạn có thể chạy pkill -t $TTY
hoặc pkill -QUIT -t $TTY
để giết tất cả các quá trình đang chạy trên thiết bị đầu cuối hiện tại, ngoại trừ lớp vỏ bỏ qua tín hiệu.
Một shell thường biến mất khi người dùng thoát nó (với lệnh như exit
hoặc logout
) hoặc khi thiết bị đầu cuối báo hiệu kết thúc đầu vào (người dùng có thể gây ra điều này bằng cách nhấn Ctrl+ D) hoặc biến mất hoàn toàn. Trong trường hợp cuối cùng này, shell nhận được tín hiệu SIGHUP và nó không bỏ qua cái đó.
Đối với trường hợp sử dụng của bạn khi đăng xuất khỏi phiên X, kill -15 -1
sẽ thực hiện việc đó, vì nó sẽ giết chết trình giả lập thiết bị đầu cuối khiến cho vỏ nhận được SIGHUP. Thực tế nó đủ để giết máy chủ X, nhưng điều đó đòi hỏi phải tìm ID tiến trình của nó. Nếu bạn muốn cùng một lệnh hoạt động trên một phiên văn bản, bạn có thể sử dụng kill -15 -1; exit
. Dù sao đó cũng là một lệnh nguy hiểm phải có trong tầm tay bạn.
¹ này dường như không được đề cập trong hướng dẫn sử dụng vỏ như một quy luật; đó là một tính năng của cuộc gọi hệ thống cơ bản. Nó được đề cập rõ ràng trong đặc tả POSIX .
² Ngày nay, để làm điều đó, hãy chạy jobs -l
để xem danh sách các công việc với ID nhóm quy trình của họ, sau đó kill -123 -456 …
để giết các nhóm quy trình.
/bin/kill
hoặc vỏ dựng sẵn? Nếu sau này, tôi đoán rằng cái vỏ sẽ không tự sát bằng chính nó.