Ctrl + C, Ctrl + D, Ctrl + Z
Комбинации клавиш Ctrl + C, Ctrl + D и Ctrl + Z часто используются в терминале для выхода из программы, работающей на переднем плане (foreground), и передачи управления Bash.
Ctrl + C выполняет прерывание процесса. По-сути убивает его. Результат действия Ctrl + D такой же. Однако разница между этими двумя способами выхода есть, и заключается она во внутреннем механизме.
Нажатие Ctrl + C заставляет терминал послать сигнал SIGINT
процессу, который на данный момент его контролирует. Когда foreground-программа получает сигнал SIGINT
, она обязана прервать свою работу.
Нажатие Ctrl + D говорит терминалу, что надо зарегистрировать так называемый EOF (end of file – конец файла), то есть поток ввода окончен. Bash интерпретирует это как желание выйти из программы.
При работе в конкретной программе могут срабатывать оба способа, но может только один. Так команда cat
без параметров запускается в интерактивном режиме, в котором то, что вы ввели, будет тут же выводиться на экран после нажатия Enter. Выйти из программы можно как с помощью Ctrl + С, так и Ctrl + D.
Выйти из интерпретатора Питона с помощью Ctrl + C нельзя.
Комбинация клавиш Ctrl + Z посылает процессу сигнал, который приказывает ему остановиться. Это значит, что процесс остается в системе, но как бы замораживается. Само собой разумеется он уходит в бэкграунд (background) – в фоновый режим. С помощью команды bg
его можно снова запустить, оставив при этом в фоновом режиме. Команда fg
не только возобновляет ранее приостановленный процесс, но и выводит его из фона на передний план.
На скриншоте сначала запускается интерпретатор Питона. Далее его работа останавливается с помощью Ctrl + Z. Командой fg python3
мы возобновляем работу приложения и делаем его текущим. То, что мы вернулись в тот же самый процесс, видно по переменной a, значение которой остается доступным.
С помощью команды ps
можно посмотреть процессы текущего сеанса Bash (используя ключи можно просматривать и другие процессы). А команда kill
позволяет удалять ненужные.
Здесь запускается cat
и приостанавливается. Далее смотрим список процессов. Ключ -9
команды kill
обозначает, что мы хотим полностью избавиться от процесса. В качестве аргумента передается идентификационный номер процесса (PID).
Отметим, что во многих консольных программах управляющие комбинации с клавишей Ctrl обычно обозначаются как ^C, ^Z и т. п. То есть вместо Ctrl используется знак ^.
Также обратим внимание, что понятие "процесса" связано с понятием "одновременного выполнения нескольких программ". Процесс – это выполняющаяся программа, а точнее экземпляр выполняющейся программы, потому что в системе может существовать несколько процессов, запущенных на основе одной программы. Ядром операционной системы создается видимость одновременного выполнения множества процессов.
При необходимости системный администратор может запускать процессы, требующие длительного выполнения, в бэкграунде, а на "переднем плане" выполнять другие команды. Запустить процесс в фоне можно с помощью знака амперсанда &
, который записывается в конце команды.
Задание
Если в текущем терминале было запущено и переведено в фон несколько одноименных процессов, то сделать один из них текущим с помощью команды fg имя_программы
не получится. PID также не используется как аргумент для fg
. Здесь используется идентификатор процесса, который возвращает команда jobs
. Причем для fg
его надо использовать в формате %ID
.
Выполните команды sleep 10m
и sleep 10s
, каждую остановите с помощью Ctrl + Z. Посмотрите идентификаторы процессов с помощью jobs
. Выведите из бэкграунда десятисекундный слип. Учитывалось ли время, когда процесс был остановлен? После этого сделайте текущим десятиминутный слип и прервите его.
Курс с ответами к заданиям и дополнительными уроками в PDF