Shell SIGKILL Keybinding

16

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

Há algo seriamente desaconselhável sobre isso?

    
por drewrobb 26.05.2011 / 07:23

2 respostas

21

Desavisável ou não, na verdade é impossível:

Os atalhos de teclado Control + [?] são realmente manipulados 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 terminal serão encaminhadas diretamente para o processo. A concha nunca seria capaz de agir sobre (ou até mesmo ver) seus pressionamentos de tecla.

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

Infelizmente, não há como enviar um dos dois sinais que não podem ser desabilitados por um processo (SIGKILL e SIGSTOP), então se todos os três sinais mencionados não tiverem efeito, você terá que usar alguns 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 de primeiro plano pode até desabilitar as combinações de teclas especiais em primeiro lugar definindo o tty para o modo "raw". O SSH faz isso, por exemplo - é assim ele pode retransmitir um Ctrl + C localmente pressionado para o host remoto.)

    
por 28.04.2012 / 10:54
2

Sim, há algo desaconselhável. Você está pulando diretamente do sinal SIGINT para o sinal SIGKILL . Sugiro, como outras pessoas fazem , procurando enviar os sinais SIGHUP ou SIGTERM antes de empregar a opção nuclear. Em seguida, há o inconveniente de ter isso como uma ligação de chave, o que obviamente significa que ele só funcionará quando o ZLE estiver ativo e o shell estiver interativamente solicitando sua entrada, não quando os comandos estiverem em execução. (Para isso, você precisaria precisar configurar o terminal, não o shell, e precisa ter uma disciplina de linha de terminal que implementa o envio de SIGTERM como uma extensão do comportamento especificado POSIX.)

Na mesma nota, ninguém mais parece ter notado que você está perguntando sobre os atalhos de teclado do editor de linha shell, não o terminal. Para responder a primeira parte da sua pergunta, então:

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

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

Em seguida, você constrói um widget definido pelo usuário do ZLE que invoca essa função do shell.

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

Então, finalmente, você vincula esse widget a uma chave de sua escolha.

bindkey "^/" terminate-current-job
    
por 26.05.2011 / 12:14