Я просто Ctrlcдважды ударил по своей оболочке, пытаясь остановить процесс, который занимает много времени, чтобы закончить.
^C
было повторено дважды, но процесс просто продолжал идти.
Почему не Ctrlcвышли из процесса как обычно?
shell
keyboard-shortcuts
зеркало
источник
источник
kill -9 %
убить их. Сигнал 9 нельзя игнорировать, как и сигнал приостановки. Последовательность клавиш CTRL + Z можно игнорировать в теории, но не на практике.perl -E '$SIG{TSTP} = sub { say "ha ha" }; sleep 1 while 1'
. Вы, наверное, думаете о SIGSTOP, это другой сигнал.Ответы:
Процессы могут выбрать:
trap '' INT
в оболочке), или иметь собственный обработчик для него, который решает не завершаться (или не завершается своевременно).stty int '^K'
в оболочке)stty -isig
в оболочке).Или они могут быть бесперебойными, как, например, в середине системного вызова, который не может быть прерван.
В Linux (с относительно новым ядром) вы можете определить, игнорирует ли процесс и / или обрабатывает ли SIGINT, посмотрев вывод
SIGINT равен 2. Второй бит SigIgn выше равен 1, что означает, что SIGINT игнорируется.
Вы можете автоматизировать это с:
Чтобы проверить, что является текущим
intr
символом илиisig
включено ли для данного терминала:(над
intr
символом^C
(символ, обычно отправляемый вашим терминалом (эмулятором) при нажатии CTRL-Cи входные сигналы не отключаются.(
intr
символ есть^K
иisig
отключен для/dev/pts/1
).Для полноты, есть два других способа, которыми процесс может что-то предпринять, чтобы прекратить получать SIGINT, хотя это обычно не так.
После Ctrl+Cэтого сигнал SIGINT отправляется всем процессам в группе процессов переднего плана терминала . Обычно это оболочка, которая помещает процессы в группы процессов (сопоставленные с заданиями оболочки ) и сообщает терминальному устройству, которое является приоритетным .
Теперь процесс может:
Оставьте свою процессную группу. Если он перемещается в другую группу процессов (любую группу процессов, кроме той, которая является приоритетной ), он больше не будет получать Ctrl-Cсигнал SIGINT (как и другие связанные с клавиатурой сигналы, такие как SIGTSTP, SIGQUIT). Однако он может быть приостановлен, если попытается выполнить чтение (возможно, запись также в зависимости от настроек терминального устройства) с терминального устройства (как это делают фоновые процессы).
В качестве примера:
не может быть прервана с Ctrl-C. Выше
perl
будет попытаться присоединиться к группе процессов, чей идентификатор совпадает с идентификатором его родительского процесса. В общем, нет никакой гарантии, что будет такая группа процессов с таким идентификатором. Но здесь, в случае, если этаperl
команда запускается самостоятельно по приглашению интерактивной оболочки, ppid будет процессом оболочки, и оболочка обычно запускается в своей собственной группе процессов.Если команда еще не является лидером группы процессов (лидером этой группы процессов переднего плана), то запуск новой группы процессов будет иметь тот же эффект.
Например, в зависимости от оболочки,
будет иметь такой же эффект.
ps
иperl
запускаются в группе процессов переднего плана, но в большинстве оболочекps
будет лидером этой группы (как видно изps
результатов выше, где pgid обоихps
иperl
pidps
), поэтомуperl
может запускать свою собственную группу процессов.Или это может изменить группу процессов переднего плана. В основном, скажите tty устройству отправить SIGINT какой-либо другой группе процессов послеCtrl+C
perl -MPOSIX -e 'tcsetpgrp (0, getppid) или умереть $ !; спать 5 '
Там
perl
остается в той же группе процессов, но вместо этого сообщает оконечному устройству, что приоритетной группой процессов является та, чей идентификатор совпадает с идентификатором его родительского процесса (см. Примечание выше об этом).источник
hdparm
илиsmartctl
на неисправном жестком диске, который не отвечает, они будут зависать вечно, и вы не можете убить их с помощью CTRL + C. Вы можете определить, находится ли процесс в непрерывном режиме сна, посмотрев на столбец statps aux
или столбец Stop
/htop
-D
означает непрерывный сон. Хотя это не обязательно плохо, это может означать, что процесс выполняет много операций ввода-вывода.