Завершение процесса в Unix вместо его прерывания
В командной строке Unix, если я нажимаю Ctrl-C, это не завершает процесс, а прерывает его, и я возвращаюсь к приглашению оболочки. Итак, у меня есть следующие два вопроса:
1. Есть ли способ, которым я могу увидеть список всех прерванных процессов и завершить их? 2. Какую комбинацию клавиш нажать, чтобы завершить процесс, а не прерывать его?
Благодарю вас.
8 ответов
Ctrl-C отправляет SIGINT. По умолчанию это завершает приложение. Возможно, вы путаете это с Ctrl-Z, который приостанавливает приложение в bash.
Исторически было три сигнала, связанных с нажатиями клавиш, это были
- SIGINT (Intettput) обычно 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, но это может быть не так, поскольку процесс может перехватить сигнал и проигнорировать его.
Не существует понятия списка "прерванных" процессов, поскольку процесс либо перехватил и проигнорировал прерывание, либо завершился. Вы можете получить список приостановленных процессов, набрав задание
Множество правильных ответов, но ни одного полного.
- Как говорили многие другие: Control-C обычно посылает сигнал Unix SIGINT, и поведение по умолчанию (от программ, которые не переопределяют его) - "завершить процесс". Программа может игнорировать этот сигнал или предпринимать другие действия, если того пожелает.
- Вы также можете отправить SIGQUIT с клавиатуры с помощью Control-\. Разница здесь в том, что по умолчанию процесс запишет файл ядра, а затем выйдет. Программа может игнорировать этот сигнал или предпринимать другие действия, если того пожелает.
- Чтобы завершить работу с предубеждением и не допуская остановки процесса, используйте SIGKILL, который по умолчанию не привязан ни к одному ключу. Вместо этого вы обычно отправляете его, используя
kill (1)
команда и указание сигнала для отправки, как в$ kill -9
или мнемонически$ kill -KILL
Этот сигнал обрабатывается непосредственно ОС, и программа не может переопределить поведение по умолчанию - Если ваша оболочка поддерживает управление заданиями, она также может поддерживать встроенную версию
kill
который поддерживает определение работы с помощью%
характер, как в ответе подиума. - Чтобы приостановить процесс возобновляемым способом, вы используете Control-z, который отправляет SIGTSTP. Вы возобновляете такой процесс либо с
fg
продолжать контролировать терминал илиbg
установить его работу без сохранения контроля над терминалом (но по умолчанию все равно отправлять свои выходные данные туда).
Ctrl-C отправляет SIGINT, что по умолчанию приводит к завершению процесса, но может быть перехвачено (в \bin sh
, с помощью trap
).
SIGKILL - это необратимый сигнал убийства.
В третий раз я думаю, что это правильно: я проверил все по документам. Посмотрим.
чтобы увидеть список фоновых процессов:
jobs
убить:
kill %1
(замените 1 соответствующим идентификатором работы, как вjobs
выход)- смотрите здесь
Это не понятно большинству новичков в терминале, но если ваша проблема в том, что вы находитесь в интерактивной программе и не можете понять, как выбраться, довольно часто q
выйдет. Например, это ключ для выхода less
, которая также является программой, которую вы получаете при просмотре man
страницы, между прочим.
Некоторые программы имеют другие сочетания клавиш для выхода. В vim
или же vi
использовать ESC:wq
, В emacs
использовать Control-C Control-X
, В nano
или же pico
использовать Control-X
, Обратите внимание, что в этих примерах есть тонкости, в частности, касающиеся того, сохраняют ли эти ярлыки какие-либо изменения, которые вы, возможно, внесли в файл, который вы редактируете.
Кажется, что другие ответы - вероятный сценарий, но также возможно, что вы выполняете сценарий, который неправильно обрабатывает его дочерние элементы. Недавно я столкнулся с похожим сценарием, где уничтожение сценария не приведет к уничтожению дочерних процессов этого сценария.
В общем, если вы попадаете в эту ситуацию, вам придется пересмотреть все процессы, которые вы запускаете. Вы должны просмотреть справочную страницу для PS. (man ps
) Мне особенно нравится использовать ps auxwf
, который показывает отношения родитель / потомок между процессами. pstree
делает что-то подобное. Вы должны запустить это из другого терминала перед тем, как убить процесс, чтобы увидеть, как все выглядит в обычной ситуации, и определить дочерние процессы.
Если затем вы убьете (с помощью ^C) этот основной процесс, снова проверьте вывод команды ps, чтобы увидеть, изменилось ли что-нибудь. Если дочерние процессы все еще существуют, вы можете убить их с помощью kill
команда. (увидеть man kill
)
Многие процессы могут установить обработчик прерываний, чтобы перехватить сигнал прерывания, но те, которые не прерывают его по умолчанию.
Чтобы принудительно завершить процесс, вы можете отправить SIGQUIT (Ctrl-\).