Ctrl + c не убьет процесс


8

Я искал ответы и до сих пор не нашел ничего, чтобы ответить на мой вопрос. В настоящее время я захожу на свой сервер Ubuntu и после запуска процесса я не могу запустить ни одно из прерываний на нем. Вот мой стиль:

user@Ubuntu1:~$ stty -a
speed 38400 baud; rows 93; columns 200; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;

У меня нет ничего в моем .bashrc, который изменяет прерывания.

Это одинаково для всех пользователей, включая root. Я также пытался войти в систему из разных мест, используя разные терминалы, и каждый раз появляется один и тот же результат. Я использовал ssh и ssh -X для входа в систему.

Изменить: локально все мои прерывания работают нормально.

Обновление: я все еще ищу ответ. У моего друга точно такая же проблема. Проблема, по-видимому, заключается в том, что при входе в систему (с ПК, Mac, Linux) клавиатура не воспринимает эти клавиши (даже если они правильно сопоставлены).


Каков выход Ctrl+Vи попадание Ctrl+C? Вы пытались убить процесс с kill -s 2 <pid_of_process>? Это должно быть равным отправке сигнала SIGINT процессу. Проверьте настройки ключа эмулятора терминала.

Вывод правильный. Если я сделаю следующее Ctrl + V, а затем Ctrl + C, я получу ^ C. Я получаю то же самое, если я нажимаю Ctrl + V, а затем Ctrl + Z, я получаю ^ Z. Я могу убить процессы с помощью kill, если я сделаю это с другого терминала. Также обратите внимание, что локально и в других терминалах эти команды работают нормально
user700786

3
Вы пытались нажать Ctrl+Cво время запуска другого процесса (например cat)? Может быть, это тот процесс, который игнорирует Ctrl+C. Или вы имеете в виду, что локально на сервере Ubuntu этот конкретный процесс отвечает Ctrl+C, и в каком случае в каком терминале вы пытались? Как насчет screenсессии?
Жиль "ТАК - перестань быть злым"

Если я запускаю что-либо в терминале на моей машине, он без проблем перехватывает прерывания. Это как только я ssh на моем сервере, что он не будет принимать прерывания. Ни один из процессов, которые я пробовал, не принимал прерываний
user700786

Если команда убита с помощью kill -s 2(обратите внимание -s 2, что это SIGINT(сигнал, который обычно посылается при нажатии Ctrl + C, по умолчанию для killis SIGTERM)), то команда не игнорирует прерывание. Что-то еще поднимает это. Когда вы запускаете это локально, и оно работает, вы говорите, что оно работает с использованием одного и того же терминала на клиентском компьютере для выполнения чего-либо локально или запуска эмулятора терминала локально на сервере? Интересно, используете ли вы какой-нибудь эмулятор, который пытается имитировать Ctrl + C из мира Windows ...
njsg

Ответы:


5

ctrl+ cникогда не убивает программу,

Это просто не то, что он делает.

Стандарт POSIX определяет набор сигналов, которые используются для управления работающей программой.

  First the signals described in the original POSIX.1-1990 standard.
  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  SIGHUP        1       Term    Hangup detected on controlling terminal
                                or death of controlling process
  SIGINT        2       Term    Interrupt from keyboard
  SIGQUIT       3       Core    Quit from keyboard
  SIGILL        4       Core    Illegal Instruction
  SIGABRT       6       Core    Abort signal from abort(3)
  SIGFPE        8       Core    Floating point exception
  SIGKILL       9       Term    Kill signal
  SIGSEGV      11       Core    Invalid memory reference
  SIGPIPE      13       Term    Broken pipe: write to pipe with no
  SIGTERM      15       Term    Termination signal

- http://man7.org/linux/man-pages/man7/signal.7.html

ctrl+ cпосылает сигнал 2«Прервать с клавиатуры» программе, которую вы запускаете с терминала.

Программа полностью обрабатывает этот сигнал, она может делать с ней все, что захочет. Многие интерпретаторы языка сценариев могут обрабатывать это по умолчанию, убивая вызываемый сценарий и корректно завершая работу.

Если вы хотите, чтобы программа выходила, особенно из автоматического контекста, рекомендуется killиспользовать singal 15, программу можно использовать для отправки сигналов процессу по id (pid).

kill -15 <pid>

Насколько я знаю, программа все еще сама получает этот сигнал и должна как можно быстрее завершать работу как можно скорее.

Однако, если программа игнорирует сигнал 15, и программа продолжает жить (и вы не можете отправить сигнал из-за ошибки разрешения)

kill -9 <pid>

Насколько мне известно, сигнал 9 интерпретируется ядром (диспетчером задач и аппаратным интерфейсом). Ядро резко останавливает обработку программы и освобождает / освобождает все ее ресурсы.


3

Вот какой-то хардкорный трюк:

Control-Z

он приостановит ваш процесс и вернет вам идентификатор работы этого процесса

Затем:

kill -9 %1

(замените 1 своим идентификатором работы).

Примечание: Процент обязателен! Иначе вы убьете процесс инициализации, что означает, что вы убьете ядро, и вся система выйдет из строя (поэтому не ставьте пробел между :)


0

Ctrl + c не остановит процесс. это просто остановит текущий рабочий процесс в середине. Чтобы убить процесс нам нужно использовать команду "KILL"


7
Фактически killпосылает сигнал процессу. Не убивает его. Сигнал по умолчанию, отправленный с, killявляется TERM, сигнал, отправленный с ctrl+cявляется SIGINT.
fmanco

0

Я наткнулся на этот старый пост на форуме об этой конкретной проблеме. Кажется, последовательность прерываний по умолчанию может быть переопределена где-то в отдельном конфигурационном файле.

Если вы просто хотите убить этот процесс извне, вы можете использовать kill, просто остерегайтесь того, что вам следует наращивать kill, как описано в этой статье о процессах уничтожения , а не просто переходить к самому экстремальному уничтожению -9.

Википедия - отличный ресурс для программы kill . Также вот список сигналов Unix и что они делают.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.