- Управление фоновыми и фоновыми процессами в Linux
- Зачем управлять заданиями?
- Необходимые условия
- Управление заданиями на переднем плане и в фоновом режиме
- Перевод задания на переднем плане в фоновый режим с помощью команды & .
- Вывод фонового задания на передний план с помощью команды fg .
- Приостановка задания на переднем плане с помощью CTRL + Z
- Возобновление приостановленного задания на переднем плане с помощью bg .
- Значение символов + и — на фоновых рабочих процессах
- Выполнение заданий даже после закрытия окна терминала
- Заключение
- Запуск команд Linux в фоновом режиме (+Видео)
- Видео
- Что такое приоритетный и фоновый режимы
- Как запустить команду в фоновом режиме
- Пример запуска команды в фоновом режиме
- Как вывести задание из фонового режима
- Просмотр заданий, работающих в фоновом режиме
- Перевод задания в фоновый режим
- Заключение
Управление фоновыми и фоновыми процессами в Linux
Эта статья была первоначально опубликована на Everything DevOps.
В операционных системах на базе Linux существует поддержка фоновой и фоновой обработки заданий. Задание в данном контексте — это просто команда, запущенная из окна терминала. Любая запущенная команда — это процесс.
Этот учебник покажет вам, как управлять заданиями на переднем и заднем плане окна терминала Linux. В конце вы узнаете:
- Зачем нужно управлять заданиями
- Как перевести задание на переднем плане в фоновый режим с помощью &
- Как вывести фоновое задание на передний план с помощью fg
- Как приостановить работу на переднем плане с помощью CTRL + Z .
- Как возобновить приостановленное задание на переднем плане с помощью bg .
- Значение символов + и — для фоновых заданий
- Как запустить процессы задания даже после закрытия окна терминала
Зачем управлять заданиями?
По умолчанию все задания в Linux выполняются в фоновом режиме. Задания переднего плана запускаются непосредственно из оболочки. Когда вы запустите одно задание на переднем плане, вам придется ждать доступа к оболочке до тех пор, пока задание не завершится, прежде чем вы сможете запустить другие задания.
Ожидание завершения заданий — это нормально, если задания выполняются быстро. Но в случаях, когда выполнение текущего задания займет много времени (даже несколько часов), это становится проблемой, особенно если у вас есть единственное окно терминала (сеанс SSH, wconsole) для работы.
В таких случаях вы можете запустить задание в фоновом режиме и освободить оболочку для других заданий и задач. Когда вы запускаете задание в фоновом режиме, оно будет выполняться с низким приоритетом, что, в свою очередь, позволит набирать другие команды в окне терминала во время выполнения задания.
Далее вы увидите, как управлять заданиями на переднем плане и в фоновом режиме.
Необходимые условия
Чтобы изучить управление заданиями на переднем плане и в фоновом режиме в Linux, вам необходим доступ к терминальному окну дистрибутива Linux.
В этом учебнике используется дистрибутив Ubuntu Linux.
Управление заданиями на переднем плане и в фоновом режиме
В этом руководстве будет использоваться команда sleep для создания фиктивных заданий в целях иллюстрации. Команда sleep при выполнении задерживает работу оболочки на определенное время. Чтобы узнать больше о команде sleep , ознакомьтесь с этой статьей.
Перевод задания на переднем плане в фоновый режим с помощью команды & .
Для начала откройте окно терминала и выполните команду:
После выполнения приведенной выше команды, она задержит оболочку на 10000 секунд, делая невозможным выполнение любой другой команды до истечения 10000 секунд, как показано на изображении ниже.
Чтобы выполнить описанную выше команду sleep в фоновом режиме, после завершения текущего задания с помощью CTRL + C , выполните команду:
После выполнения вышеуказанной команды вы получите результат, подобный изображению ниже, и ваша оболочка вернется к выполнению других команд.
На изображении выше sleep 10000 & — это процесс 3647 с номером задания 1 , и в данный момент он выполняется в фоновом режиме.
Чтобы увидеть задание, запустите его:
Приведенная выше команда покажет все задания в фоновом режиме вашего терминального сеанса и их текущее состояние.
Вывод фонового задания на передний план с помощью команды fg .
В некоторых случаях, после перевода задания в фоновый режим, вы можете захотеть что-то с ним сделать; вот тут-то и приходит на помощь команда fg . Команда fg используется для перемещения фонового задания в текущей оболочке Linux на передний план.
Чтобы вернуть текущее задание на передний план, выполните команду:
Рядом с % в приведенной выше команде находится номер задания 1 . После выполнения команды вы увидите, что оно снова находится на переднем плане.
Приостановка задания на переднем плане с помощью CTRL + Z
Допустим, вы хотите приостановить работу на некоторое время, чтобы выполнить другие команды; вы можете сделать это с помощью CTRL + Z . CTRL + Z переводит задание в режим «остановлено» и не завершает его.
Возобновление приостановленного задания на переднем плане с помощью bg .
Чтобы возобновить процесс sleep 10000 , вы можете использовать команду bg . bg возобновит процесс задания и переведет его в фоновый режим.
В командной оболочке выполните:
Значение символов + и — на фоновых рабочих процессах
Если вы заметили на скриншотах символ + рядом с номером задания, то вы также заметили — , и они оба имеют значение, как вы можете видеть в цитате ниже:
В выводе, относящемся к команде jobs), текущее задание всегда помечается + , а предыдущее — — . — Раздел «JOB CONTROL» на странице bash manpage.
Чтобы продемонстрировать приведенную выше цитату, создайте еще два фиктивных задания в фоновом режиме.
$ sleep 10001 & $ sleep 10002 &
После выполнения вышеуказанных команд выполните команду $ jobs , чтобы увидеть все процессы заданий:
Как видно на изображении выше, последнее из созданных вами заданий отмечено символом + , а предыдущие — — .
До сих пор вы узнали, как переводить задания переднего плана в фоновый режим, возвращать их на передний план, приостанавливать и возобновлять их. Все это помогает вам быть более эффективным, когда у вас есть одно окно терминала для работы.
Далее вы узнаете, как сделать так, чтобы задание выполнялось даже после закрытия окна терминала.
Выполнение заданий даже после закрытия окна терминала
Когда у вас есть задания, выполняемые в фоновом или переднем плане, все задания будут завершены, если вы закроете окно терминала. Задания завершаются потому, что они связаны с этим конкретным сеансом терминала. И при выходе из него всем запущенным процессам посылается сигнал зависания (HUP).
Чтобы проверить это на практике, если предыдущие задания, которые вы создали, все еще выполняются, закройте окно терминала, откройте его снова и запустите команду $ jobs . Вы увидите, что ни один процесс задания не запущен, как показано на рисунке ниже.
Чтобы заставить задания продолжать выполняться даже после закрытия окна терминала, вы можете использовать команды nohup , disown и другие. В данном руководстве используются только команды nohup и disown . Чтобы узнать о других командах, ознакомьтесь с рекомендациями других пользователей Linux на askubuntu.
Когда использовать nohup ? Когда использовать disown ?
Если вы можете заранее предположить, что закроете окно терминала и не хотите повесить запущенные задания, используйте nohup . Если нет, используйте disown , который позволяет отключить процесс от терминальной сессии после того, как она уже была создана.
Использование nohup
Чтобы использовать nohup и продолжить выполнение заданий даже после закрытия окна терминала, при создании задания добавьте nohup .
Для практической реализации в окне терминала создайте фиктивное задание с nohup :
После выполнения вышеуказанной команды вы увидите вывод терминала, подобный изображенному ниже:
Аннотированный вывод терминала выше означает, что nohup будет добавлять (добавлять) любой вывод из процесса задания sleep 10000 в файл под названием nohup.out . Вы можете найти файл nohup.out в вашей текущей рабочей директории, как показано на рисунке ниже.
Вы также можете перенаправить вывод определенного задания в другой файл. Чтобы узнать, как это сделать, посмотрите этот вопрос и ответ на Unix & Linux StackExchange.
Теперь, когда вы закрываете терминал и открываете его снова, вы все еще можете найти запущенное задание sleep 10000 . Но на этот раз не с помощью команды $ jobs , а с помощью команды $ ps -aux | grep sleep , как показано на рисунке ниже.
Второй процесс sleep , который вы видите в выводе терминала выше, был запущен не вами, а командой grep . Чтобы узнать, почему он там находится, посмотрите эти ответы на stackoverflow.
Чтобы завершить работу, выполните команду:
После выполнения команды вы все еще можете видеть второй процесс, как показано на рисунке ниже:
Использование disown
Поскольку все созданные вами задания «остановлены», чтобы узнать, как использовать disown , создайте новый фиктивный процесс задания:
Затем отключите его от этой конкретной терминальной сессии с помощью:
Теперь закройте окно терминала, откройте его снова и выполните команду $ ps -aux | grep sleep , чтобы увидеть запущенный процесс работы, как показано на рисунке ниже.
Заключение
В этом уроке вы узнали, как управлять рабочими процессами на переднем плане и в фоновом режиме в окне терминала Linux. Чтобы узнать больше об управлении процессами в Linux, ознакомьтесь со следующими ресурсами:
Запуск команд Linux в фоновом режиме (+Видео)
В данной заметке мы рассмотрим, как запускать команды Linux в фоновом режиме. То есть, когда после запуска какой-либо команды, она начинает свою работу в фоне, а вы продолжаете работать в терминале.
Видео
Видео-версия. Наше видео про запуск команд в фоновом режиме.
Что такое приоритетный и фоновый режимы
Обычно все команды Linux запускаются в оболочке (в командной строке) в приоритетном режиме, называемом foreground. В этом режиме оболочка ожидает завершения работы команды, прежде чем пользователь сможет ввести новую команду.
Можно запускать команды Linux в фоновом режиме — background, при котором не нужно ожидать завершения команды, чтобы запустить другую команду.
Пользователь может запускать несколько команд в фоновом режиме одновременно. То есть эти команды будут выполняться параллельно. При этом окно терминала доступно для ввода новых команд.
Как запустить команду в фоновом режиме
Чтобы запустить команду в фоновом режиме, нужно в конец команды через пробел добавить знак амперсанда &
Синтаксис запуска команды в фоновом режиме можно записать следующим образом:
Пример запуска команды в фоновом режиме
Рассмотрим пример. Предположим, нам нужно распаковать большой tar-архив. Выполняем команду:
$ tar -xf archive.tar & [1] 7958 $
Распаковка архива выполняется в фоновом режиме, а мы можем вводить в терминале новые команды.
Как вы можете видеть, на экран выводятся символы [1] 7958
[1] — это номер, который оболочка назначила нашему фоновому заданию, чтобы мы могли идентифицировать его и управлять им (см. ниже как).
7958 — это идентификатор (PID) процесса, который был создан.
Как вывести задание из фонового режима
Если вы запустили один или несколько процессов в фоновом режиме, то вы можете подключиться к любому из них и вывести из фонового режима (перевести в приоритетный режим). Для этого используется команда fg
Команда fg , запущенная без аргументов, выводит из фонового режима последний запущенный фоновый процесс.
Например, запустим две команды в фоновом режиме и выполним команду fg . В результате мы выведем вторую команду из фонового режима.
$ tar -xf archive1.tar & [1] 8054 $ tar -xf archive2.tar & [2] 8055 $ fg tar -xf archive2.tar
Можно указать номер конкретного задания, которое нужно вывести из фонового режима:
$ tar -xf archive1.tar & [1] 8054 $ tar -xf archive2.tar & [2] 8055 $ fg 1 tar -xf archive1.tar
Просмотр заданий, работающих в фоновом режиме
Для просмотра заданий, работающих в фоновом режиме, используется команда jobs
$ jobs [1] Запущен tar -xf archive1.tar & [2]- Запущен tar -xf archive2.tar & [3]+ Запущен gedit &
Символом плюс + помечается последнее запущенное задание. Если использовать команду fg без аргументов, то она будет применена именно к этому заданию.
Символом минус — помечается задание, которое было запущено перед последним.
Перевод задания в фоновый режим
Чтобы перевести задание, которое в данный момент работает в приоритетном режиме, в фоновый режим, используется команда bg
Так как задание работает в приоритетном режиме, то вы не можете вводить команды, поэтому сначала нужно приостановить выполнение задания. Для этого используется сочетание клавиш Ctrl+Z
После этого можно выполнить команду bg , чтобы продолжить выполнение задания, но уже в фоновом режиме.
Заключение
Мы кратко рассмотрели, как запускать команды Linux в фоновом режиме. Использование фонового режима позволяет запускать одновременно несколько процессов из одного окна терминала (экземпляра оболочки). Особенно это удобно, когда команда должна выполняться длительное время и не требует постоянного наблюдения. Пользователь при этом может продолжать пользоваться командной строкой.