Исторически было три сигнала, связанных с нажатиями клавиш, это были
- SIGINT (Прерывание) обычно Ctrl+ CилиDel
- SIGQUIT - Выход - Обычно связан с Ctrl+\
- SIGSUSP Suspend - обычно связан с Ctrl+Z
На некоторых разновидностях * nix есть и другие связанные сигналы, вы можете проверить привязки клавиатуры, используя команду
stty -a
В моей системе OS / X это выдает следующий вывод
speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
Обратите внимание, что в этом случае kill не является сигналом KILL, это связано с очисткой текущего входного буфера.
Вы можете добиться большего успеха с остановкой процессов с использованием SIGQUIT, но это может быть не так, поскольку процесс может перехватить сигнал и проигнорировать его.
Не существует понятия списка «прерванных» процессов, поскольку процесс либо перехватил и проигнорировал прерывание, либо завершился. Вы можете получить список приостановленных процессов, набрав задание
stty -ixon
так, чтобы они были пропущены. Я думаю, что они изменятся на<undef>
.Множество правильных ответов, но ни одного полного.
Чтобы завершить работу с предубеждением и не допуская остановки процесса, используйте SIGKILL, который по умолчанию не привязан ни к одному ключу. Вместо этого вы обычно отправляете его, используя
kill (1)
команду и указывая сигнал для отправки, как вили мнемонически
Этот сигнал обрабатывается непосредственно ОС, и программа не может переопределить поведение по умолчанию.
Если ваша оболочка поддерживает управление заданиями, она также может поддерживать встроенную версию,
kill
которая поддерживает идентификацию заданий с помощью%
символа, как в ответе подиума .fg
продолжая управлять терминалом, либоbg
запускать его без сохранения контроля над терминалом (но по умолчанию все равно отправляете свой вывод туда).источник
чтобы увидеть список фоновых процессов:
jobs
убить:
kill %1
(подставьте 1 с соответствующим идентификатором задания, как вjobs
выводе)источник
Ctrl-C отправляет SIGINT, что по умолчанию приводит к завершению процесса, но может быть захвачено (
\bin sh
используяtrap
).SIGKILL - это необратимый сигнал убийства.
В третий раз я думаю, что это правильно: я проверил все по документам. Посмотрим.
источник
Это не понятно большинству новичков в терминале, но если ваша проблема в том, что вы находитесь в интерактивной программе, и вы не можете понять, как выбраться из нее, довольно часто
q
это происходит. Например, это ключ для выходаless
, которыйman
, помимо прочего , является программой, которую вы получаете при просмотре страниц.Некоторые программы имеют другие сочетания клавиш для выхода. В
vim
илиvi
, используйтеESC:wq
. Вemacs
, использоватьControl-C Control-X
. Вnano
илиpico
, используйтеControl-X
. Обратите внимание, что в этих примерах есть тонкости, в частности, касающиеся того, сохраняют ли эти ярлыки какие-либо изменения, которые вы, возможно, внесли в файл, который вы редактируете.источник
Многие процессы могут установить обработчик прерывания для перехвата сигнала прерывания, но те, которые не прерывают его по умолчанию.
Чтобы принудительно завершить процесс, вы можете отправить SIGQUIT (Ctrl- \).
источник
Кажется, что другие ответы - вероятный сценарий, но также возможно, что вы выполняете сценарий, который неправильно обрабатывает его дочерние элементы. Недавно я столкнулся с похожим сценарием, где уничтожение сценария не приведет к уничтожению дочерних процессов этого сценария.
В общем, если вы попадаете в эту ситуацию, вам придется пересмотреть все процессы, которые вы запускаете. Вы должны просмотреть справочную страницу для PS. (
man ps
) Мне особенно нравится использованиеps auxwf
, которое показывает отношения родитель / потомок между процессами.pstree
делает что-то подобное. Вы должны запустить это из другого терминала перед тем, как убить процесс, чтобы увидеть, как все выглядит в обычной ситуации, и определить дочерние процессы.Если вы затем убьете (с помощью ^ C) этот основной процесс, снова проверьте вывод команды ps, чтобы увидеть, изменилось ли что-нибудь. Если дочерние процессы все еще существуют, вы можете убить их с помощью
kill
команды. (см.man kill
)источник