Окончание процесса в Unix вместо того, чтобы прервать его

В Unix командная строка, если я нажимаю Ctrl-C, который не заканчивает процесс, а скорее прерывает его, и я возвращаюсь к приглашению оболочки.

Так, у меня есть следующие два вопроса:

    1. Существует ли путь i, видят список всех прерванных процессов и заканчивают их?
    1. Какое сочетание клавиш нажать для окончания процесса вместо того, чтобы прервать его?
12
задан 30.08.2019, 19:51

7 ответов

Ctrl+C отправляет a SIGINT. По умолчанию это завершает приложение.

Вы путаете это с Ctrl-Z, который приостанавливает приложение в ударе.

20
ответ дан 07.12.2019, 11:46

Исторически было три сигнала, связанные с нажатиями клавиш, которыми они были

  • SIGINT (Intettput) обычно Ctrl+C или Del
  • SIGQUIT - Выход - Обычно связываемый с Ctrl +\
  • SIGSUSP Приостанавливают - Обычно связываемый с Ctrl+Z

На некоторых *отклоняют ароматы существуют другие сигналы, также связанные, можно проверить клавиатурные привязки с помощью команды

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, но это не может быть верно, поскольку процесс может поймать сигнал и проигнорировать его.

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

7
ответ дан 07.12.2019, 11:46

Много корректных ответов, но ни одного, что завершено.

  1. Поскольку многие другие сказали: Ctrl-C обычно отправляет сигналу Unix SIGINT и поведение по умолчанию (из программ, которые не переопределяют его), "оконечный процесс". Программа может проигнорировать этот сигнал или принять другие меры, если это требует.
  2. Можно также отправить SIGQUIT от клавиатуры с Управлением-\. Различие здесь - то, что по умолчанию процесс запишет базовый файл, затем выйдет. Программа может проигнорировать этот сигнал или принять другие меры, если это требует.
  3. Для завершения с экстремальным предубеждением и не позволяя процессу остановить Вас используют SIGKILL, который не связывается ни с каким ключом по умолчанию. Вместо этого Вы обычно отправляете его с помощью kill (1) команда и определение сигнала отправить как в

    $ kill -9 <process ID>
    

    или мнемонически

    $ kill -KILL <process ID>
    

    Этот сигнал обрабатывается непосредственно ОС, и программа не может переопределить поведение по умолчанию.

  4. Если Ваша оболочка поддерживает управление заданиями, это может также поддерживать созданный в версии kill который поддерживает идентификацию задания с помощью % символ как в ответе подиума.

  5. Для приостановки процесса способным резюме способом, Вы используете Управление-z, которое отправляет SIGTSTP. Вы возобновляете такой процесс с также fg продолжаться в управлении терминала или bg установить его работающий, не удерживая контроль над терминалом (но, по умолчанию, все еще отправляя его вывод туда).
5
ответ дан 07.12.2019, 11:46
  1. видеть список фоновых процессов: jobs

    уничтожить: kill %1 (займите место 1 с соответствующим идентификатором задания как в jobs вывод)

  2. посмотрите здесь
1
ответ дан 07.12.2019, 11:46

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

Чтобы вынудить процесс выйти, можно отправить SIGQUIT (Ctrl-\).

0
ответ дан 07.12.2019, 11:46

Ctrl-C отправляет SIGINT, который значением по умолчанию заставляет процесс заканчиваться, но может быть захвачен (в \bin sh, использование trap).

SIGKILL является untrappable сигналом уничтожения.

Отредактируйте В третий раз, когда я думаю, что это правильно: я проверил все по документам. Увидим.

1
ответ дан 07.12.2019, 11:46

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

В целом при вхождении в эту ситуацию необходимо будет рассмотреть все процессы, которые Вы выполняете. Необходимо рассмотреть страницу справочника для PS (man ps) Мне особенно нравится использовать ps auxwf, который показывает родительские/дочерние отношения между процессами. pstree делает что-то подобное. Необходимо выполнить это от другого терминала прежде, чем уничтожить процесс для наблюдения то, на что вещи похожи в нормальной ситуации и определяют дочерние процессы.

Если Вы затем уничтожаете (с ^C), что основной процесс, проверьте вывод PS снова, чтобы видеть, изменилось ли что-нибудь. Если дочерние процессы все еще вокруг, можно уничтожить их с kill команда. (см. man kill)

0
ответ дан 07.12.2019, 11:46

Теги

Похожие вопросы