쉘 SIGKILL 키 바인딩


18

SIGKILL현재 포 그라운드 작업에 키 바인딩을 보내려면 어떻게 키 바인딩을 설정할 수 있습니까? 나는 이미 알고 Ctrl+가 C있다 SIGINTCtrl+ \입니다 SIGQUIT. 더 심한 옵션을 원합니다.

이것에 대해 심각하게 권하지 않는 것이 있습니까?


쉘이 아닌 터미널 드라이버가 전송합니다 (이 프로그램으로 수행중인 작업을 완전히 인식하지 못합니다).
user1686

지정된 쉘 zsh, 그리고 질문이 키 바인딩에 대해 이야기한다는 사실에 대해서는 언급하지 않았습니다 . 이것은 zsh터미널 설정에 관한 것이 아니라의 라인 편집기 구성에 관한 질문 입니다.
JdeBP

답변:


26

바람직하지 않은지, 실제로는 불가능합니다 :

포 그라운드에서 프로세스가 실행되는 동안 터미널의 입력 및 출력이 프로세스로 직접 전달되므로 Control + [?] 키 바인딩은 실제로 쉘이 아닌 tty 드라이버에 의해 처리됩니다. 껍질은 결코 당신의 키 누르기에 작용하거나 볼 수 없습니다.

stty -a; 에서 현재 할당 된 Ctrl + [?] 키 조합 목록을 얻을 수 있습니다 . 그러나 intr(SIGINT, 보통 Ctrl + C에 바인딩 됨) quit(SIGQUIT, 보통 Ctrl + \에 바인딩 됨) 및 susp(SIGSUSP, 보통 Ctrl + Z에 바인딩 됨)는 실제 유닉스 신호에 해당합니다. ( kill,예를 들어, SIGKILL을 보내지 않지만 현재 입력을 삭제합니다.)

불행히도 프로세스에서 비활성화 할 수없는 두 신호 (SIGKILL 및 SIGSTOP) 중 하나를 전송할 수있는 방법이 없으므로 언급 된 세 가지 신호가 모두 효과가 없으면 다른 방법을 사용해야합니다 ( 포 그라운드 프로세스를 죽이는 다른 쉘).

(실제로, 세 가지 신호를 모두 포착하는 것 외에도 포 그라운드 프로세스는 tty를 "원시"모드로 설정하여 처음부터 특수 키 조합을 비활성화 할 수도 있습니다. 예를 들어 SSH는이를 수행합니다. 원격 호스트에 로컬로 누른 Ctrl + C.)


3

예, 바람직하지 않은 것이 있습니다. 신호 SIGINT에서 SIGKILL신호로 직접 도약하고 있습니다 . 다른 사람들처럼 핵 옵션을 사용하기 전에 SIGHUP또는 SIGTERM신호 를 보내는 것이 좋습니다 . 그런 다음 이것을 키 바인딩으로 사용하는 것은 불가피합니다. 물론 ZLE가 활성화되어 있고 쉘이 명령을 실행할 때가 아니라 대화식으로 입력을 요구하는 경우에만 작동한다는 것을 의미합니다. (이를 위해, 당신은 것입니다 구현이 전송하는 터미널 라인 규율하도록 터미널이 아닌 쉘 및 필요성을 구성 할 필요가 SIGTERMPOSIX의 행동 지정된 확장으로합니다.)

이 메모에서 터미널이 아닌 쉘 라인 편집기 키 바인딩에 대해 묻는 사람은 아직 없습니다. 질문의 첫 부분에 대답하려면 다음을 수행하십시오.

신호를 "현재"작업으로 보내도록 쉘 기능을 설정했습니다.

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

그런 다음이 쉘 함수를 호출하는 ZLE 사용자 정의 위젯을 구성합니다.

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

그런 다음 마지막으로 해당 위젯을 선택한 키에 바인딩합니다.

bindkey "^/" terminate-current-job

1
나는 그가 실제로 라인 편집기에 대해 이야기하고 있지 않다고 생각합니다. 만약 그가 쉘에 입력한다면, 실행중인 포 그라운드 프로세스가 없을 것입니다. 포 그라운드 프로세스가 실행되고 현재 tty에 연결된 경우 쉘은 실제로 키 누르기를 보지 않습니다.
lxgr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.