Shell SIGKILL Keybinding

18

Jak skonfigurować przypisanie klawiszy, aby wysłać SIGKILLzadanie do bieżącego zadania na pierwszym planie? Wiem już, że Ctrl+ Cjest SIGINTi Ctrl+ \jest SIGQUIT. Chciałbym bardziej surową opcję.

Czy jest w tym coś poważnie niewskazanego?

drewrobb
źródło
Jest wysyłany przez sterownik terminala, a nie przez powłokę (która jest całkowicie nieświadoma tego, co robisz z programem).
user1686
Nie zauważyłeś określonej powłoki zsh, a także faktu, że pytanie mówi o skrótach klawiszowych. To pytanie dotyczy konfiguracji zshedytora linii, a nie konfiguracji własnego terminalu.
JdeBP

Odpowiedzi:

27

Niewskazane czy nie, w rzeczywistości jest to niemożliwe:

Skróty klawiszowe Control + [?] Są obsługiwane przez sterownik tty, a nie przez powłokę, ponieważ dopóki na pierwszym planie działa proces, dane wejściowe i wyjściowe terminala będą przekazywane bezpośrednio do procesu. Powłoka nigdy nie byłaby w stanie oddziaływać (ani nawet widzieć) na naciśnięcia klawiszy.

Możesz uzyskać listę aktualnie przypisanych kombinacji klawiszy Ctrl + [?] Od stty -a; jednak tylko intr(SIGINT, zwykle związany z Ctrl + C) quit(SIGQUIT, zwykle związany z Ctrl + \) i susp(SIGSUSP, zwykle związany z Ctrl + Z) odpowiadają rzeczywistym sygnałom unix. ( kill,na przykład nie wysyła SIGKILL, ale usuwa bieżące dane wejściowe).

Niestety nie ma sposobu na wysłanie jednego z dwóch sygnałów, których proces nie może wyłączyć (SIGKILL i SIGSTOP), więc jeśli wszystkie trzy wspomniane sygnały nie przyniosą efektu, musisz użyć innego sposobu ( np. kolejna powłoka), aby zabić proces pierwszego planu.

(W rzeczywistości, oprócz przechwytywania wszystkich trzech sygnałów, proces pierwszego planu może nawet wyłączyć specjalne kombinacje klawiszy w pierwszej kolejności, ustawiając tty na tryb „raw”. SSH robi to na przykład - w ten sposób może przekazywać lokalnie wciśnięty klawisz Ctrl + C na zdalnym hoście).

Lxgr
źródło
3

Tak, jest coś niewskazanego. Skaczesz bezpośrednio z sygnału SIGINTna SIGKILLsygnał. Sugeruję, podobnie jak inni ludzie , rozważenie wysłania sygnałów SIGHUPlub SIGTERMprzed zastosowaniem opcji jądrowej. Następnie jest niewskazana, aby mieć to jako powiązanie klucza, co oczywiście oznacza, że ​​będzie działać tylko wtedy, gdy ZLE jest aktywny, a powłoka interaktywnie monituje o podanie danych wejściowych, a nie podczas wykonywania poleceń. (Do tego pan będzie trzeba skonfigurować terminal, a nie powłoki, i trzeba mieć dyscyplinę końcową linię, która implementuje podając SIGTERMjako przedłużenie POSIX określonego zachowania).

W tej notatce nikt jeszcze nie zauważył, że pytasz o skróty klawiszowe edytora linii powłoki, a nie terminal. Aby odpowiedzieć na pierwszą część pytania, wówczas:

Skonfigurowałeś funkcję powłoki, aby wysłać sygnał do „bieżącego” zadania.

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

Następnie konstruujesz widget zdefiniowany przez użytkownika ZLE, który wywołuje tę funkcję powłoki.

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

Następnie w końcu przypisujesz ten widget do wybranego klucza.

bindkey "^/" terminate-current-job
JdeBP
źródło
1
Wydaje mi się, że tak naprawdę nie mówi o edytorze linii - jeśli pisze w powłoce, nie będzie działającego procesu pierwszego planu, prawda? Powłoka nigdy nie zobaczyłaby naciśnięć klawiszy, jeśli uruchomiony jest proces pierwszego planu i podłączony do bieżącego tty.
Lxgr