Оболонка SIGKILL


18

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

Чи є щось серйозно непомітне в цьому?


Він надсилається драйвером терміналу, а не оболонкою (що абсолютно не знає, що ви робите з програмою).
користувач1686

Ви не відзначили вказану оболонку, що є zsh, і той факт, що в цьому питанні йдеться про сполучення клавіш. Це питання про налаштування zshредактора рядків, а не про налаштування терміналу.
JdeBP

Відповіді:


27

Не спостерігається чи ні, насправді неможливо:

Пов’язки клавіш 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 на віддалений хост.)


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

1
Я думаю, він насправді не говорить про редактор рядків - якби він набрав оболонку, процес переднього плану не відбувся б, правда? Оболонка ніколи насправді не побачить натискання клавіш, якщо буде запущений процес переднього плану та підключений до поточного tty.
lxgr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.