Encadernação de teclas Shell SIGKILL

18

Como posso configurar uma combinação de teclas para enviar uma SIGKILLpara o trabalho em primeiro plano atual? Eu já sei que Ctrl+ Cé SIGINTe Ctrl+ \é SIGQUIT. Eu gostaria de uma opção mais severa.

Existe algo seriamente desaconselhável sobre isso?

drewrobb
fonte
É enviado pelo driver do terminal, não pelo shell (que não tem conhecimento do que você está fazendo com o programa).
grawity
Você não notou o shell especificado, o que é zsh, e o fato de a pergunta falar sobre combinações de teclas. Esta é uma pergunta sobre a configuração zshdo editor de linha, não sobre a configuração do terminal.
JdeBP 26/05

Respostas:

26

Inacessível ou não, é realmente impossível:

As combinações de teclas Control + [?] São realmente tratadas pelo driver tty e não pelo shell, porque enquanto houver um processo em execução em primeiro plano, a entrada e a saída do seu terminal serão encaminhadas diretamente para o processo. O shell nunca seria capaz de agir (ou até mesmo ver) suas teclas pressionadas.

Você pode obter uma lista das combinações de teclas Ctrl + [?] Atribuídas no momento stty -a; no entanto, apenas intr(SIGINT, geralmente vinculado a Ctrl + C) quit(SIGQUIT, geralmente vinculado a Ctrl + \) e susp(SIGSUSP, geralmente vinculado a Ctrl + Z) correspondem aos sinais unix reais. ( kill,por exemplo, não envia SIGKILL, mas exclui a entrada atual.)

Infelizmente, não há como enviar um dos dois sinais que não podem ser desativados por um processo (SIGKILL e SIGSTOP); portanto, se todos os três sinais mencionados não tiverem efeito, você precisará usar outra maneira ( por exemplo, outro shell) para matar o processo em primeiro plano.

(Na verdade, além de capturar todos os três sinais, o processo em primeiro plano pode até desativar as combinações especiais de teclas em primeiro lugar, definindo o tty no modo "bruto". O SSH faz isso, por exemplo - é assim que pode retransmitir um Ctrl + C pressionado localmente no host remoto.)

lxgr
fonte
3

Sim, há algo desaconselhável. Você está saltando diretamente do SIGINTao SIGKILLsinal. Sugiro, como as outras pessoas , olhando para o envio da SIGHUPou SIGTERMsinais antes de empregar a opção nuclear. Depois, é desaconselhável ter isso como uma ligação de chave, o que obviamente significa que ele só funcionará quando o ZLE estiver ativo e o shell solicitar interativamente a entrada, e não quando os comandos estiverem em execução. (Para isso, você iria precisar configurar o terminal, não o shell, e necessidade de ter uma disciplina linha terminal que implementa o envio SIGTERMcomo uma extensão do POSIX especificado comportamento.)

Nessa nota, ninguém mais parece ter notado ainda que você está perguntando sobre as combinações de teclas do editor de linha de shell, e não o terminal. Para responder à primeira parte da sua pergunta, então:

Você configura uma função shell para enviar o sinal para o trabalho "atual".

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

Então você constrói um widget definido pelo usuário do ZLE que chama essa função de shell.

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

Finalmente, você vincula esse widget a uma chave de sua escolha.

bindkey "^/" terminate-current-job
JdeBP
fonte
1
Eu acho que ele não está realmente falando sobre o editor de linha - se ele estiver digitando no shell, não haveria processo em primeiro plano, certo? O shell nunca veria as teclas pressionadas se houvesse um processo em primeiro plano em execução e conectado ao tty atual.
Lxgr #