Связка клавиш Shell SIGKILL

18

Как настроить привязку клавиш для отправки SIGKILLна текущее задание переднего плана? Я уже знаю, что Ctrl+ Cесть SIGINTи Ctrl+ \есть SIGQUIT. Я хотел бы более серьезный вариант.

Есть ли что-то серьезно нежелательное в этом?

drewrobb
источник
Он отправляется драйвером терминала, а не оболочкой (которая совершенно не знает, что вы делаете с программой).
user1686
Вы не отметили указанную оболочку zsh, а также тот факт, что в вопросе говорится о сочетаниях клавиш. Это вопрос о настройке zshредактора строк, а не о настройке терминала.
JdeBP

Ответы:

26

Нежелательно или нет, это на самом деле невозможно:

Сочетания клавиш Control + [?] Фактически обрабатываются драйвером tty, а не оболочкой, поскольку, пока существует процесс, выполняющийся на переднем плане, ввод и вывод вашего терминала будут перенаправляться непосредственно процессу. Оболочка никогда не сможет воздействовать (или даже видеть) ваши нажатия клавиш.

Вы можете получить список назначенных в данный момент комбинаций клавиш Ctrl + [?] Из stty -a; однако, только intr(SIGINT, обычно связанный с Ctrl + C) quit(SIGQUIT, обычно связанный с Ctrl + \) и susp(SIGSUSP, обычно связанный с Ctrl + Z) соответствуют фактическим unix-сигналам. ( kill,например, не отправляет SIGKILL, но удаляет текущий ввод.)

К сожалению, нет способа отправить один из двух сигналов, которые не могут быть отключены процессом (SIGKILL и SIGSTOP), поэтому, если все три упомянутых сигнала не имеют никакого эффекта, вам придется использовать другой способ ( например, другая оболочка), чтобы убить процесс переднего плана.

(На самом деле, в дополнение к перехвату всех трех сигналов, процесс переднего плана может даже отключить специальные комбинации клавиш в первую очередь, установив tty в «сырой» режим. Например, это делает SSH - так он может ретранслировать локально нажмите Ctrl + C для удаленного хоста.)

lxgr
источник
3

Да, есть что-то нецелесообразное. Вы прыгаете прямо с SIGINTна SIGKILLсигнал. Я предлагаю, как и другие люди , рассмотреть вопрос об отправке сигналов SIGHUPили, SIGTERMпрежде чем использовать ядерный вариант. Кроме того, нежелательно иметь это в качестве привязки клавиш, что, конечно же, означает, что она будет работать только тогда, когда ZLE активен, а оболочка в интерактивном режиме запрашивает ввод данных, а не во время выполнения команд. (Для этого вам будет необходимо настроить терминал, а не оболочку, а также необходимость иметь терминальную линию дисциплину , которая реализует отправку SIGTERMкак расширение POSIX указанного поведения.)

На этом замечании, кажется, никто еще не заметил, что вы спрашиваете о привязках клавиш редактора командной строки, а не о терминале. Чтобы ответить на первую часть вашего вопроса, тогда:

Вы настраиваете функцию оболочки для отправки сигнала «текущей» работе.

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

Затем вы создаете пользовательский виджет ZLE, который вызывает эту функцию оболочки.

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

Затем, наконец, вы связываете этот виджет с ключом по вашему выбору.

bindkey "^/" terminate-current-job
JdeBP
источник
1
Я предполагаю, что он на самом деле не говорит о редакторе строк - если он печатает в оболочке, не будет запущенного процесса переднего плана, верно? Оболочка никогда не увидит нажатия клавиш, если запущен процесс переднего плана и подключен к текущему tty.
LXGR