Móc khóa SIGKILL


18

Làm cách nào tôi có thể thiết lập một liên kết phím để gửi một SIGKILLcông việc tiền cảnh hiện tại? Tôi đã biết rằng Ctrl+ CSIGINTCtrl+ \SIGQUIT. Tôi muốn một lựa chọn nghiêm trọng hơn.

Có bất cứ điều gì nghiêm trọng không thể tin được về điều này?


Nó được gửi bởi trình điều khiển thiết bị đầu cuối, không phải bằng vỏ (điều này hoàn toàn không biết bạn đang làm gì với chương trình).
grawity

Bạn đã không lưu ý đến phần vỏ được chỉ định, đó là zsh, và thực tế là câu hỏi nói về keybindings. Đây là một câu hỏi về cách định cấu hình zshtrình chỉnh sửa dòng, không phải về việc thiết lập thiết bị đầu cuối của một người.
JdeBP

Câu trả lời:


26

Không mong muốn hay không, nó thực sự là không thể:

Các phím điều khiển + [?] Thực sự được xử lý bởi trình điều khiển tty chứ không phải bởi trình bao, bởi vì miễn là có một quá trình chạy ở nền trước, đầu vào và đầu ra của thiết bị đầu cuối của bạn sẽ được chuyển trực tiếp đến quy trình. Shell sẽ không bao giờ có thể tác động lên (hoặc thậm chí nhìn thấy) phím bấm của bạn.

Bạn có thể nhận danh sách các tổ hợp phím Ctrl + [?] Hiện được gán từ stty -a; tuy nhiên, chỉ intr(SIGINT, thường được liên kết với Ctrl + C) quit(SIGQUIT, thường được liên kết với Ctrl + \) và susp(SIGSUSP, thường được liên kết với Ctrl + Z) tương ứng với các tín hiệu unix thực tế. ( kill,ví dụ: không gửi SIGKILL, nhưng xóa đầu vào hiện tại.)

Thật không may, không có cách nào để gửi một trong hai tín hiệu không thể bị vô hiệu hóa bởi một quá trình (SIGKILL và SIGSTOP), vì vậy nếu cả ba tín hiệu được đề cập không có hiệu lực, bạn sẽ phải sử dụng một cách khác ( ví dụ: shell khác) để giết tiến trình tiền cảnh.

(Trên thực tế, ngoài việc bắt được cả ba tín hiệu, quy trình tiền cảnh thậm chí có thể vô hiệu hóa các tổ hợp phím đặc biệt ở vị trí đầu tiên bằng cách đặt chế độ tty thành "thô". Ví dụ, SSH thực hiện điều này - đây là cách nó có thể chuyển tiếp một Ctrl + C được nhấn cục bộ đến máy chủ từ xa.)


3

Vâng, có một cái gì đó không thể tìm thấy. Bạn đang nhảy trực tiếp từ SIGINTđến SIGKILLtín hiệu. Tôi đề nghị, như những người khác , nhìn vào việc gửi SIGHUPhoặc SIGTERMtín hiệu trước khi sử dụng tùy chọn hạt nhân. Sau đó, có sự bất cẩn khi có điều này như một ràng buộc chính, điều đó tất nhiên có nghĩa là nó sẽ chỉ hoạt động khi ZLE hoạt động và trình bao tương tác nhắc bạn nhập liệu, không phải khi các lệnh đang chạy. (Đối với điều đó, bạn sẽ cần phải định cấu hình thiết bị đầu cuối, không phải vỏ và cần phải có kỷ luật dòng thiết bị đầu cuối thực hiện gửi SIGTERMdưới dạng phần mở rộng hành vi được chỉ định POSIX.)

Trên lưu ý đó, dường như không ai khác nhận thấy rằng bạn đang hỏi về các phím bấm trình soạn thảo dòng vỏ, không phải thiết bị đầu cuối. Để trả lời phần đầu tiên của câu hỏi của bạn, sau đó:

Bạn thiết lập chức năng shell để gửi tín hiệu đến công việc "hiện tại".

function terminate-current-job() { kill -s TERM %+ ; }

Sau đó, bạn xây dựng một tiện ích do người dùng ZLE định nghĩa để gọi hàm shell này.

zle -N terminate-current-job terminate-current-job

Sau đó, cuối cùng, bạn liên kết widget đó với một khóa bạn chọn.

bindkey "^/" terminate-current-job

1
Tôi đoán anh ấy không thực sự nói về trình soạn thảo dòng - nếu anh ấy gõ vào trình bao, sẽ không có quá trình chạy nền trước, phải không? Shell sẽ không bao giờ thực sự nhìn thấy các phím bấm nếu có một quá trình tiền cảnh đang chạy và kết nối với tty hiện tại.
lxgr
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.