Shell SIGKILL Keybinding

18

¿Cómo puedo configurar una combinación de teclas para enviar una SIGKILLal trabajo actual en primer plano? Ya sé que Ctrl+ Ces SIGINTy Ctrl+ \es SIGQUIT. Me gustaría una opción más severa.

¿Hay algo seriamente desaconsejable sobre esto?

dibujante
fuente
Lo envía el controlador de terminal, no el shell (que desconoce por completo lo que está haciendo con el programa).
user1686
No ha notado el shell especificado, que es zsh, y el hecho de que la pregunta habla sobre las combinaciones de teclas. Esta es una pregunta sobre la configuración zshdel editor de línea, no sobre la configuración del terminal.
JdeBP

Respuestas:

26

Desaconsejable o no, en realidad es imposible:

Las combinaciones de teclas Control + [?] En realidad son manejadas por el controlador tty y no por el shell, ya que mientras haya un proceso ejecutándose en primer plano, la entrada y salida de su terminal serán enviadas directamente al proceso. El shell nunca podría actuar (o incluso ver) las pulsaciones de teclas.

Puede obtener una lista de las combinaciones de teclas Ctrl + [?] Asignadas actualmente de stty -a; sin embargo, solo intr(SIGINT, generalmente vinculado a Ctrl + C) quit(SIGQUIT, generalmente vinculado a Ctrl + \) y susp(SIGSUSP, generalmente vinculado a Ctrl + Z) corresponden a señales Unix reales. ( kill,por ejemplo, no envía SIGKILL, pero elimina la entrada actual).

Desafortunadamente, no hay forma de enviar una de las dos señales que no puede ser deshabilitada por un proceso (SIGKILL y SIGSTOP), por lo que si las tres señales mencionadas no tienen efecto, tendrá que usar otra forma ( por ejemplo, otro shell) para eliminar el proceso en primer plano.

(En realidad, además de capturar las tres señales, el proceso de primer plano puede incluso deshabilitar las combinaciones de teclas especiales en primer lugar al configurar el tty en modo "sin procesar". SSH hace esto, por ejemplo, así es como puede transmitir un Ctrl + C presionado localmente al host remoto).

lxgr
fuente
3

Sí, hay algo desaconsejable. Estás saltando directamente de SIGINTla SIGKILLseñal. Sugiero, como lo hacen otras personas , mirar enviar las señales SIGHUPo SIGTERMantes de emplear la opción nuclear. Luego está la desaconsejable de tener esto como un enlace clave, lo que por supuesto significa que solo funcionará cuando ZLE esté activo y el shell le solicite interactivamente entrada, no cuando los comandos se estén ejecutando. (Para ello, se le tenga que configurar el terminal, no la cáscara, y la necesidad de tener una disciplina de línea terminal que implementa el envío SIGTERMcomo una extensión del POSIX especifica el comportamiento.)

En esa nota, nadie más parece haberse dado cuenta de que está preguntando sobre las combinaciones de teclas del editor de línea de shell, no el terminal. Para responder la primera parte de su pregunta, entonces:

Configura una función de shell para enviar la señal al trabajo "actual".

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

Luego construye un widget ZLE definido por el usuario que invoca esta función de shell.

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

Luego, finalmente, vincula ese widget a una clave de su elección.

bindkey "^/" terminate-current-job
JdeBP
fuente
1
Supongo que en realidad no está hablando del editor de línea: si está escribiendo en el shell, no habría un proceso en primer plano, ¿verdad? El shell nunca vería las pulsaciones de teclas si hay un proceso en primer plano ejecutándose y conectado al tty actual.
lxgr