Как завершить программу в оболочке Unix? [Дубликат]

0

Возможное дублирование:
что делать, если ctrl-c не может убить процесс?

На моем ноутбуке я нажимаю функциональную клавишу ноутбука + перерыв. На моем рабочем столе мой ключ прерывания (рядом с экраном печати) выглядит так:

Pause
Break

Если я нажимаю его (без Ctrl / Alt / и т. Д.), Я получаю это (игнорируйте эхо, они просто есть, чтобы я мог понять, что к чему):

# sleep 10;echo "no ctrl/alt/shift/etc"

[12]+  Stopped                 sleep 10

Если я нажимаю это со сдвигом, я получаю это:

[root@ID6052 public_html]# sleep 10;echo "shift + pause/break"

[13]+  Stopped                 sleep 10

Если я нажимаю его с помощью Ctrl, ничего не происходит.

Если я нажимаю Pause / Break с Alt, я получаю это:

[root@ID6052 public_html]# sleep 10;echo "alt + pause/break"

[15]+  Stopped                 sleep 10

Как мне заставить его просто остановить программу? Если я получаю список запущенных процессов, все эти команды «[xx] + Stopped ...» отображаются (в остановленном состоянии). На моем ноутбуке нажатие кнопки func + break (т. Е. Просто клавиши обычного прерывания ... кнопка func также используется для блокировки прокрутки, экрана печати и т. Д.) Полностью закрывает программы!

Сообщество
источник
О, хорошо, я пробовал Ctrl + C, хотя он работает для сна, другие команды не работают с ним. например, найдите. | меньше, и он не выйдет (хотя и меньше). Есть ли способ выйти из тех программ, которые позволяют ввод текста (например, меньше)?
В этой ситуации, lessподобно vimили emacs, принимает меры для более полного захвата ввода с клавиатуры. Вы должны знать, как выйти из этих программ (q (может быть ^ Cq, если в режиме 'tail') в less; <ESC>: q <Return> в vim; ^ X ^ C в emacs). Хотя эти (и большинство других) программ позволят вам приостановить (остановить) их с помощью ^ Z, тогда вы можете использовать оболочку, чтобы убить их (ответ Питера упоминает об этом). Хотя программы тоже могут 'захватить' ^ Z (технически это делает emacs, но по умолчанию он приостанавливает себя, когда получает ^ Z). AFAIK, нет единого способа выйти из любой программы tty из того же tty.
Крис Джонсен
1
Почему этот вопрос помечен как дубликат? Он был задан в 2009 году, но дублирован на вопрос, заданный в 2011 году. Что мне не хватает?
Питер

Ответы:

3

Обычно оболочка Unix будет иметь следующие сопоставления клавиш

control-C => SIGINT (прерывание)
control-Z => SIGTSTP (терминальная остановка / приостановка)

иногда есть также
control-y => отложенный останов (не уверен, как это делается)

Control-C обычно прерывает и завершает вашу программу. Но SIGINT может обрабатываться и игнорироваться или обрабатываться программой.

Control-Z обычно приостанавливает (останавливает) вашу программу. Но SIGSTSP также может обрабатываться и игнорироваться или обрабатываться программой, хотя на практике это кажется более редким, чем обработка SIGINT.

Отправка SIGSTOP ( kill -STOPиз другого терминала) приостановит (остановит) вашу программу и не может быть обработана.

Похоже, что комбинации клавиш, которые приводят к остановке вашей программы, вероятно, эквивалентны Control-Z.

Если вы получаете процессы в остановленном состоянии, ваша оболочка сообщает номер задания. Похоже, вы используете Bash. В любом случае, большинство оболочек позволяют вам контролировать остановленные или фоновые задания, используя их номера.

kill -KILL %1
kill -9 %1
bg %1
fg %1

И так далее, убивать, убивать, ставить в фоновом режиме или ставить на первый план свою (первую) работу соответственно.

Вы можете использовать команду

jobs

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

Питер
источник
1

Вы можете использовать Ctrl-, Cчтобы завершить выполнение программы в терминале.

Вы можете убить программы, которые уже были остановлены с kill:

kill PID

где PIDидентификатор процесса (число, которое вы увидите в psвыводе):

[Джон @ удивительный] $ питон
Python 2.4.3 (# 1, 17 сентября 2008, 16:04:01)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-41)] в Linux
Введите «помощь», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации.
>>>
[1] + остановленный питон
[Джон @ удивительный] $ п.с.
  PID TTY TIME CMD
 3560 баллов / 1 00:00:00
 3588 баллов / 1 00:00:00 питон
 3609 баллов / 1 00:00:00 пс

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

Джон Т
источник
0

Существует два основных способа прерывания работающей программы из терминала Unix:

  1. Ctrl- cотправит сигнал INT (Прерывание), который по умолчанию вызовет выход из программы, но некоторые программы отменяют это.
  2. Ctrl- \отправит сигнал ВЫХОД, который чаще будет останавливать выполнение программы, но часто не будет выходить так же чисто.

Если они не работают, используйте клавишу Ctrl-, zчтобы приостановить программу (или переключиться на другой терминал), и используйте killкоманду, чтобы отправить сигналы TERMили KILL(в указанном порядке) программе. Последний всегда завершает работу программы, когда в следующий раз появляется возможность ее запуска (что происходит не всегда сразу, как если бы она читала из сетевого файла).

Тедди
источник