Shell SIGKILL Keybinding


18

Come posso impostare un keybinding per inviare un SIGKILLal lavoro in primo piano corrente? So già che Ctrl+ Cè SIGINTe Ctrl+ \è SIGQUIT. Vorrei un'opzione più severa.

C'è qualcosa di veramente sconsigliabile in questo?


Viene inviato dal driver del terminale, non dalla shell (che non è completamente a conoscenza di ciò che si sta facendo con il programma).
user1686,

Non hai notato la shell specificata, ovvero zsh, e il fatto che la domanda parli di combinazioni di tasti. Questa è una domanda sulla configurazione zshdell'editor di linea, non sulla configurazione del proprio terminale.
JdeBP,

Risposte:


26

Invisibile o no, in realtà è impossibile:

Le combinazioni di tasti Control + [?] Sono in realtà gestite dal driver tty e non dalla shell, poiché fintanto che c'è un processo in esecuzione in primo piano, l'input e l'output del terminale verranno inoltrati direttamente al processo. La shell non sarebbe mai in grado di agire (o addirittura vedere) sui tasti premuti.

È possibile ottenere un elenco delle combinazioni di tasti Ctrl + [?] Attualmente assegnate da stty -a; tuttavia, solo intr(SIGINT, in genere associato a Ctrl + C) quit(SIGQUIT, in genere associato a Ctrl + \) e susp(SIGSUSP, in genere associato a Ctrl + Z) corrispondono ai segnali unix effettivi. ( kill,ad esempio, non invia SIGKILL, ma cancella l'input corrente.)

Sfortunatamente, non c'è modo di inviare uno dei due segnali che non possono essere disabilitati da un processo (SIGKILL e SIGSTOP), quindi se tutti e tre i segnali citati non hanno effetto, dovrai usare un altro modo ( ad esempio un'altra shell) per terminare il processo in primo piano.

(In realtà, oltre a catturare tutti e tre i segnali, il processo in primo piano può anche disabilitare le combinazioni di tasti speciali in primo luogo impostando la modalità tty su "raw". SSH fa questo, per esempio - ecco come può inoltrare un Ctrl + C premuto localmente sull'host remoto.)


3

Sì, c'è qualcosa di sconsigliabile. Stai saltando direttamente dal SIGINTal SIGKILLsegnale. Suggerisco, come fanno le altre persone , di inviare i segnali SIGHUPo SIGTERMprima di utilizzare l'opzione nucleare. Poi c'è l'invisibilità di avere questo come un key binding, il che ovviamente significa che funzionerà solo quando ZLE è attivo e la shell ti richiede in modo interattivo di input, non quando i comandi sono in esecuzione. (Per questo, si avrebbe bisogno di configurare il terminale, non la shell, e il bisogno di avere una disciplina di linea terminale che implementa l'invio SIGTERMcome estensione POSIX specificato comportamento.)

In quella nota, nessun altro sembra aver ancora notato che stai chiedendo delle combinazioni di tasti dell'editor della shell line, non del terminale. Per rispondere alla prima parte della domanda, quindi:

Si imposta una funzione shell per inviare il segnale al lavoro "corrente".

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

Quindi costruisci un widget ZLE definito dall'utente che invoca questa funzione di shell.

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

Quindi, infine, associ quel widget a una chiave di tua scelta.

bindkey "^/" terminate-current-job

1
Immagino che in realtà non stia parlando dell'editor di linea - se sta digitando nella shell, non ci sarebbe alcun processo in primo piano in esecuzione, giusto? La shell non vedrebbe mai effettivamente i tasti premuti se c'è un processo in primo piano in esecuzione e collegato al tty corrente.
lxgr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.