|
|||||||
|
Как управлять задачами в терминале - команды jobs, fg, bg, kill, и сочетание клавиш Ctrl+Z
Время создания: 26.08.2026 09:56
Автор: xintrea
Текстовые метки: linux, задача, процесс, jobs, fg, bg, kill, ctrl+z, запуск, приостановка, остановка, запуск
Раздел: Компьютер - Linux - Bash - Терминал
Запись: xintrea/mytetra_syncro/master/base/1787727391msbcx1x2xb/text.html на raw.githubusercontent.com
|
|||||||
|
|
|||||||
|
В Linux есть старый и давно устаканившийся механизм управления задачами, позволяющий работать в многозадачной системе, используя только одно окно терминала. В настоящее время практически все эмуляторы терминалов позволяют создавать неограниченное количество окон или вкладок, в которых запущен отдельный экземпляр терминала. Но раньше было не так: древние системы unix были консольными, а подключение к ним происходило через один аппаратный терминал, который давал только одну консоль. И в таких условиях надо было как-то управлять запуском и остановкой выполняемых задач. Для этого использовались специальные подходы и утилиты, о которых идет речь в этой статье. Фоновые задачи Задача - это, по сути, любая программа, запущенная соответствующей командой запуска программы. При обычном запуске программа просто выполняется в текущем терминале, и ее ввод-вывод отображается в консоли. Пользователь в реальном времени видит как работает программа и имеет возможность взаимодействовать с ней. Но в Linux задачу можно поместить в фон (при этом задача попадет в список фоновых задач), причем в фоне задача может продолжать выполняться, а может быть временно остановлена. Команда jobs Перед тем как разобраться, как управлять запущенными задачами, как помещать их в фон, как запускать и останавливать, надо узнать, каким образом просматривать список фоновых задач, как понимать их состояние. Для просмотра списка фоновых задач используется команда jobs. Вот пример того, какую информацию выводит jobs: > jobs [1] Запущен sleep 10000 & [2] Запущен sleep 20000 & [3]- Остановлен sleep 30000 [4]+ Остановлен sleep 40000 [5] Запущен sleep 50000 & Итак, что здесь видно? Первый столбец - это номер фоновой задачи. Он используется при управлении задачами. Далее, у двух задач видны символы плюс "+" и минус "-". Что они означают? Символ "+" помечает последнюю задачу, которой управлял пользователь (например, запускал или останавливал). Символ "-" помечает пред-последнюю задачу, которой управлял пользователь. Во всем списке задач может быть только одна метка "+" и одна метка "-". Зачем они нужны? Символ "+" показывает текущую задачу, с которой что-то делал пользователь. Задача, на которой стоит символ "+", является задачей по-умолчанию для управления. В обычном случае, в командах управления задачами надо указывать номер задачи. Но для ускорения работы, номер задачи можно не задавать. Тогда действие будет происходит с текущей задачей, то есть с той, которая помечена символом "+". Символ "-" показывает, какая задача станет текущей, в случае, если текущая задача будет завершена. Следующий столбец отображает статус задачи. Как видно из примера, статуса может быть два - Запущен (Running) и Остановлен (Stopped). Статус Остановлен (Stopped) означает, что задача была приостановлена, и может быть запущена либо фоне, либо выведена на передний план (стать текущей), тем самым продолжив свою работу. При некоторых условиях можно еще увидеть статус Завершёно (Terminated, а в некоторых системах Done) - этот статус говорит о том, что задача завершена, и продолжить ее работу невозможно. Последний столбец показывает команду, которая выполняется в задаче. У некоторых команд в конце виден символ амперсанд "&", у некоторых его нет. Что это такое и почему у некоторых задач его нет, описыватся в следующих разделах. Как поместить задачу в фон? Задачу в фон можно поместить двумя способами. Способ первый - поместить задачу в фон сразу, при запуске исполняемой команды. Для этого в конце команды надо поставить символ амперсанд "&". Если команда при своей работе никак не взимодействует с вводом-выводом на терминал, то она будет размещена в фоне в запущенном виде, и статус у нее будет Запущен. Примечание. Если команда использует ввод-вывод на терминал или использует интерактивный текстовый интерфейс пользователя, то такая команда будет размещена в фоне, но будет остановлена. Это происходит из-за того, что в фоне нет терминала, где программа могла бы выводить свой интерфейс. Поэтому статус у такой фоновой задачи будет отмечен как Остановлен. Примером таких программ может быть watch, vim, htop, mc. В любом случае, задачу можно достать из фона и ее работа будет продолжена (об этом позже). Второй способ поместить задачу в фон - это просто запустить нужную консольную программу и нажать клавиши Ctrl+Z. В этом случае задача будет остановлена и помещена в фон. Статус при таком способе перемещения в фон всегда будет Остановлен. Примечение. Некоторые команды, например такие как "yes" или "ls -R /" очень сильно забивают терминальный вывод, из-за чего сигнал остановки по Ctrl+Z не срабатывает. Можно сколько угодно нажимать Ctrl+Z, но эффекта не будет. Это такая особенность Linux-консоли, так она сделана. И поэтому подобные команды просто невозможно поместить в фон сочетанием клавиш Ctrl+Z. Да, вот так работает Linux. При обоих способах помещения задачи в фон (через команду с "&" или через Ctrl+Z), задача будет размещена в фоне, а консоль пользователя продолжит работать, и в ней можно продолжать выполнять все необходимые команды пользователя. Как достать задачу из фона? Когда задача достается из фона, она размещается на "переднем плане". То есть, задаче отдается текущая консоль, задача запускается (если у нее был статус Остановлен), или продолжает свою работу если был статус Запущен. То есть, задача начинает работать в консоли пользователя. Чтобы достать задачу из фона, надо воспользоваться командой fg (от слова foreground, т. е. передний план). В качестве параметра указывается номер задачи, который виден в списке команды jobs. Можно не указывать номер задачи, тогда на передений план будет выведена задача, у которой стоял флажок "+". Например, если редактор vim находился в задаче номер 3, то переключиться в редактор можно консольной командой: fg 3 После того, как в редакторе vim было что-то отредактировано и нужно переключиться на каку-то другую задачу, нажимается сочетание клавиш Ctrl+Z. При этом vim останавливается и помещается в фон, а пользователю снова показывается его консоль. Как остановить задачу в фоне? Разработчики системы управления фоновыми задачами - большие оригиналы. Почему-то они не предусмотрели специальной команды, которая бы останавливала заданную задачу в фоне. Вместо этого они предлагают следующую последовательность действий:
Да, это странно, но в Linux так заведено. Если задача была запущена через способ с амперсандом "&" в конце команды, то в списке задач, отображаемом через jobs, у остановленной задачи амперсанда в команде не будет выводиться. Эту особенность следует учитывать, если пишется какая-то автоматизация и анализируется вывод утилиты jobs. Как запустить остановленную задачу в фоне? Если задача находится в фоне, и она была остановлена (т. е. jobs показывает статус Остановлен), то такую задачу можно запустить в фоне, не выводя ее на передний план. Запустить в фоне можно только те задачи, в работе которых не используется взаимодействие с терминалом, о чем уже было сказано выше. Задачи, которым требуется взаимодействие с терминалом, невозможно запустить в фоне, и даже если попробовать это сделать, они останутся в статусе Остановлен. Запуск задачи в фоне производится командой bg (от слова background). В качестве параметра указывается номер задачи. Так же как и в команде fg, номер задачи можно не указывать, тогда в фоне будет запущена задача с пометкой "+". При запуске задачи в фоне, пользователь просто остается в своей консоли. Никакого переключения на фоновую задачу не происходит. Как удалить задачу из фона? Есть несколько возможностей удаления фоновой задачи. Вариант 1 - воспользоваться командой jobs -l для получения дополнительных подробностей в списке задач. Благодаря опции "-l", рядом с номером задачи будет написан PID процесса, например: > jobs -l [1]+ 15763 Остановлено watch -n 15 "cat /var/log/dpkg.log | tail -n 10" Зная PID, задачу можно удалить командой: kill -9 <PID>. Вариант 2 - воспользоваться специальным синтаксисом команды kill. Вместо того, чтобы узнавать PID, можно через знак процента "%" указать номер задачи. Например, для удаления задачи номер 1, требуется дать команду: kill -9 %1 Вариант 3 - переместить задачу на передний план и завершить ее штатным выходом из программы, либо путем нажатия сочетания Ctrl+C. * * * По сути, это весь инструментарий, через который осуществляется управление фоновыми задачами. В современных интерфейсах пропала необходимость пользоваться этим механизмом. Но если возникнет необходимость что-то сделать на древней машине, к которой терминал прикручен напрямую, нет возможности сделать несколько SSH-сессий, а утилиты screen и tmux просто недоступны, то умение управляться консолью с фоновыми процессами может очень сильно пригодиться. |
|||||||
|
Так же в этом разделе:
|
|||||||
|
|||||||
|
|||||||
|