Shell SIGKILL Keybinding

18

Wie kann ich eine Tastenkombination einrichten, um eine SIGKILLan den aktuellen Vordergrundjob zu senden ? Ich weiß bereits, dass Ctrl+ Cist SIGINTund Ctrl+ \ist SIGQUIT. Ich hätte gerne eine strengere Option.

Gibt es irgendetwas, von dem ernsthaft abgeraten wird?

drewrobb
quelle
Es wird vom Terminal-Treiber gesendet, nicht von der Shell (die nicht weiß, was Sie mit dem Programm tun).
Grawity
Sie haben die angegebene Shell zshund die Tatsache, dass es sich bei der Frage um Tastenkombinationen handelt , nicht notiert . Dies ist eine Frage zum Konfigurieren zshdes Zeileneditors und nicht zum Einrichten des Terminals.
JdeBP

Antworten:

26

Nicht ratsam oder nicht, es ist tatsächlich unmöglich:

Die Tastenkombinationen Strg + [?] Werden tatsächlich vom tty-Treiber und nicht von der Shell verarbeitet, da die Eingabe und Ausgabe Ihres Terminals direkt an den Prozess weitergeleitet werden, solange ein Prozess im Vordergrund ausgeführt wird. Die Shell würde niemals in der Lage sein, auf Ihre Tastendrücke zu reagieren (oder sie sogar zu sehen).

Sie können eine Liste der aktuell zugewiesenen Strg + [?] - Tastenkombinationen abrufen von stty -a; Allerdings entsprechen nur intr(SIGINT, normalerweise an Strg + C quitgebunden) susp(SIGQUIT, normalerweise an Strg + \ gebunden) und (SIGSUSP, normalerweise an Strg + Z gebunden) den tatsächlichen Unix-Signalen. ( kill,Sendet beispielsweise kein SIGKILL, löscht jedoch die aktuelle Eingabe.)

Leider gibt es keine Möglichkeit, eines der beiden Signale zu senden, die nicht durch einen Prozess deaktiviert werden können (SIGKILL und SIGSTOP). Wenn also alle drei genannten Signale keine Wirkung haben, müssen Sie eine andere Methode verwenden ( zB eine andere Shell), um den Vordergrundprozess abzubrechen.

(Tatsächlich kann der Vordergrundprozess nicht nur alle drei Signale erfassen, sondern auch die speziellen Tastenkombinationen deaktivieren, indem der tty-Modus auf "raw" gesetzt wird. Dies kann beispielsweise durch SSH weitergeleitet werden eine lokal gedrückte Strg + C auf dem Remote-Host.)

lxgr
quelle
3

Ja, da ist etwas nicht ratsam. Sie springen direkt vom SIGINTzum SIGKILLSignal. Ich schlage vor, wie andere Leute auch , das Senden der Signale SIGHUPoder zu SIGTERMprüfen, bevor sie die nukleare Option anwenden. Dann ist es nicht ratsam, dies als Tastenzuordnung zu verwenden, was natürlich bedeutet, dass es nur funktioniert, wenn ZLE aktiv ist und die Shell Sie interaktiv zur Eingabe auffordert, nicht, wenn Befehle ausgeführt werden. (Dazu müssten Sie das Terminal und nicht die Shell konfigurieren und über eine Terminalleitungsdisziplin verfügen, die das Senden SIGTERMdes von POSIX angegebenen Verhaltens als Erweiterung implementiert .)

In diesem Sinne scheint noch niemandem aufgefallen zu sein, dass Sie nach den Tastenkombinationen des Shell-Line-Editors fragen, nicht nach dem Terminal. Um den ersten Teil Ihrer Frage zu beantworten, dann:

Sie richten eine Shell-Funktion ein, um das Signal an den "aktuellen" Job zu senden.

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

Anschließend erstellen Sie ein benutzerdefiniertes ZLE-Widget, das diese Shell-Funktion aufruft.

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

Anschließend binden Sie das Widget an einen Schlüssel Ihrer Wahl.

bindkey "^/" terminate-current-job
JdeBP
quelle
1
Ich vermute, er redet eigentlich nicht über den Zeileneditor - wenn er in die Shell tippt, würde es keinen laufenden Vordergrundprozess geben, oder? Die Shell würde die Tastendrücke nie wirklich sehen, wenn ein Vordergrundprozess läuft und mit dem aktuellen tty verbunden ist.
lxgr