17

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

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

2 ответа2

23

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

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

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

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

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

2

Да, есть что-то нецелесообразное. Вы прыгаете прямо с 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .