В Unix
командная строка, если я нажимаю Ctrl-C, который не заканчивает процесс, а скорее прерывает его, и я возвращаюсь к приглашению оболочки.
Так, у меня есть следующие два вопроса:
Исторически было три сигнала, связанные с нажатиями клавиш, которыми они были
На некоторых *отклоняют ароматы существуют другие сигналы, также связанные, можно проверить клавиатурные привязки с помощью команды
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;
Отметьте, уничтожают в этом экземпляре, не Сигнал уничтожения, он относится к очистке текущего входного буфера.
Можно иметь больше успеха с остановкой процессов с помощью SIGQUIT, но это не может быть верно, поскольку процесс может поймать сигнал и проигнорировать его.
Нет никакого понятия списка "прерванных" процессов, поскольку процесс или поймал и проигнорировал прерывание, или это вышло. Можно получить список приостановленных процессов путем ввода заданий
Много корректных ответов, но ни одного, что завершено.
Для завершения с экстремальным предубеждением и не позволяя процессу остановить Вас используют SIGKILL, который не связывается ни с каким ключом по умолчанию. Вместо этого Вы обычно отправляете его с помощью kill (1)
команда и определение сигнала отправить как в
$ kill -9 <process ID>
или мнемонически
$ kill -KILL <process ID>
Этот сигнал обрабатывается непосредственно ОС, и программа не может переопределить поведение по умолчанию.
Если Ваша оболочка поддерживает управление заданиями, это может также поддерживать созданный в версии kill
который поддерживает идентификацию задания с помощью %
символ как в ответе подиума.
fg
продолжаться в управлении терминала или bg
установить его работающий, не удерживая контроль над терминалом (но, по умолчанию, все еще отправляя его вывод туда).Ctrl-C отправляет SIGINT, который значением по умолчанию заставляет процесс заканчиваться, но может быть захвачен (в \bin sh
, использование trap
).
SIGKILL является untrappable сигналом уничтожения.
Отредактируйте В третий раз, когда я думаю, что это правильно: я проверил все по документам. Увидим.
Кажется, что другие ответы являются вероятным сценарием, но также возможно, что Вы выполняете сценарий, который не обрабатывает его детей правильно. Я недавно поразил подобный сценарий, где уничтожение сценария не уничтожит дочерние процессы того сценария.
В целом при вхождении в эту ситуацию необходимо будет рассмотреть все процессы, которые Вы выполняете. Необходимо рассмотреть страницу справочника для PS (man ps
) Мне особенно нравится использовать ps auxwf
, который показывает родительские/дочерние отношения между процессами. pstree
делает что-то подобное. Необходимо выполнить это от другого терминала прежде, чем уничтожить процесс для наблюдения то, на что вещи похожи в нормальной ситуации и определяют дочерние процессы.
Если Вы затем уничтожаете (с ^C), что основной процесс, проверьте вывод PS снова, чтобы видеть, изменилось ли что-нибудь. Если дочерние процессы все еще вокруг, можно уничтожить их с kill
команда. (см. man kill
)