fbpx
linux
51

Linux Bash: Основы управления фоновыми процессами

0
(0)

Часто разработчик или пользователь linux захочет запустить процесс в фоновом режиме, либо из командной строки, либо изнутри сценария, а затем снова обработать тот же процесс позже. Существуют различные инструменты командной строки, которые позволяют это делать. Возможность запускать, управлять и уничтожать фоновые процессы является требованием для многих задач более сложного уровня, особенно в областях расширенных сценариев и управления процессами.


Изучай Linux в нашем блоге

Посмотреть другие статьи на эту тему можно тут


linux процессы

В этом уроке вы узнаете:

  • Как запускать, обрабатывать и / или управлять и уничтожать фоновые процессы
  • Какие инструменты командной строки доступны для помощи в управлении процессами Bash
  • Примеры, подчеркивающие использование фоновых процессов в командной строке Bash

Требования к программному обеспечению и используемые условные обозначения

Категория Требования, условные обозначения или используемая версия программного обеспечения
Система Linux дистрибутив
Программное обеспечение Командная строка Bash, система на базе Linux
Другое Любую утилиту, которая по умолчанию не входит в оболочку Bash, можно установить с помощью sudo apt-get install имя-утилиты (или yum install для систем на базе RedHat).
Условные обозначения # - требует, чтобы команды linux выполнялись с правами root либо непосредственно как пользователь root, либо с помощью команды sudo $ - требует, чтобы команды linux выполнялись от имени обычного непривилегированного пользователя

Пример 1: Запуск процесса в фоновом режиме и возвращение его на передний план.

Здесь мы запустили 1000-секундный процесс сна в фоновом режиме. Если мы хотим поместить процесс в фоновый режим, мы можем использовать знак амперсанда (&) позади любой команды. Это поместит процесс в фоновый режим и сообщит PID (идентификатор процесса, номер идентификатора, который идентифицирует любой процесс, запущенный на машине Linux). В этом примере PID равен 25867. Обратите внимание, что процесс продолжает работать, когда он помещается в фоновый режим, что дает нам лучшее из обоих миров; процесс выполняется, а мы тем временем возвращаем нашу командную строку! Здорово.

Затем мы возвращаем процесс на передний план (как если бы фоновой инструкции никогда не было) с помощью команды fg (т.е. переднего плана). В результате мы видим, какой процесс снова помещается на передний план (т.е. sleep 1000), и наша командная строка не возвращается, поскольку мы вернули сон обратно на передний план, и командная строка вернется только после того, как будет выполнен 1000-секундный сон.

Допустим, мы поместили sleep 1000 в фоновый режим, выполняли другую работу в течение 500 секунд, а затем выполнили fg ... Как долго еще будет длиться сон? Если вы угадали (или знали) 500 секунд, значит, вы правы. Первые 500 секунд были потрачены на выполнение в фоновом режиме, а вторые 500 секунд - в фоновом режиме. Также обратите внимание, что если вы завершите работу оболочки, ваша команда прекратит работу - независимо от того, работает ли она в фоновом режиме или на переднем плане (если вы не отказались от нее, подробнее об этом в следующем примере).

Пример 2: отказ от процесса bash

Здесь мы начали еще один 1000-секундный сон и, как и раньше, были проинформированы о PID фонового процесса. Затем мы выполнили disown% 1, обращаясь к первому фоновому процессу (на что также указывает [1] перед PID!), И инструктируя Bash отключить (отсоединить) этот процесс от текущей оболочки. Это не значит, что он будет отделен от текущего пользователя (и, например, ps -ef | grep sleep | grep -v grep действительно будет показывать ваш идентификатор пользователя), а скорее от текущего сеанса оболочки. Смотри:

bash

Затем, открыв новую оболочку и повторно запустив ps, мы видим, что команда все еще существует и теперь прикреплена к PPID (Parent PID) 1 вместо 26120 в качестве родительского PID:

$ ps -ef | grep sleep | grep -v grep roel 26214 1 0 19:48 ? 00:00:00 sleep 1000

Это как если бы оболочка все еще запущена (обратите внимание, что PID 26214 все еще активен / связан с запущенным режимом снаsleep), однако его активная часть командной строки исчезла! Отлично, так что это дает нам возможность отделить процессы от текущей оболочки и, таким образом, гарантировать, что они продолжат работу, когда наша сессия оболочки закрыта.

Пример 3: Размещение команды в фоновом режиме

Здесь мы запустили ожидание sleep 1000 на переднем плане (& не использовался), и прервали этот процесс сочетанием клавиш CTRL + z. Обратите внимание, что хотя в выходных данных указано ^Z^ - это символ, обозначающий CTRL), Z на самом деле является буквой z в нижнем регистре, поэтому вам не нужно использовать SHIFT, просто CTRL + z.

Обратите внимание, что процесс фактически остановился, а не продолжил работу. Теперь мы поместили процесс в фоновый режим и приостановили его. Чтобы позволить этому процессу продолжить работу сейчас, у нас есть два варианта; fg %1 - т.е. вернуть процесс, обозначенный [1], на передний план и продолжить работу в обычном режиме, или bg %1, который возобновит процесс, но в фоновом режиме. В примере мы видим последнее, и наша командная строка возвращается, как и ожидалось.

Обратите внимание, что приведенное выше может быть немного дополнено с помощью disown, соответствующего часто используемому способу обработки процесса при использовании удаленного сервера. Допустим, вы подключены через SSH к удаленному серверу и начали большое задание, например, резервное копирование или создание отчета. Теперь вы хотите покинуть свой офис на день, но не уверены, будет ли ваше SSH-соединение работать всю ночь и даже не перейдет ли ваш компьютер в спящий режим или что-то подобное. Любое из этих действий может поставить под угрозу работающую работу!

В этом случае вы можете сделать следующее:
bash

Можете благополучно и с чувством безопасности отойти от вашего компьютера (после его блокировки), так как вы можете быть уверены, что - даже если ваше SSH-соединение оборвется, или ваш компьютер перейдет в спящий режим, или выбьет шнур питания уборщица - ваш процесс будет работать. Поскольку процесс был отключен / разъеденён от текущего сеанса оболочки, он продолжит работу, даже если текущий сеанс оболочки каким-то образом завершится.

Одно небольшое предостережение заключается в том, что вы не можете использовать fg утром, чтобы вернуть задание на передний план, даже если ваше SSH-соединение и оболочка никогда не прерываются / не завершаются:

bash

Когда от нее отказываются, она отделяется и исчезает! Однако задание по-прежнему будет выполняться в фоновом режиме, и вы даже можете убить его, используя его PID (как видно из ps -ef | grep your_process_name | grep -v grep).

Пример 4: Несколько фоновых процессов и завершающиеся процессы

Сначала мы запускаем два процесса в фоновом режиме, используя наш пример
bash

Здесь мы видим, что были запущены два фоновых процесса ([1] и [2] с PID 27158 и 27159 соответственно). Далее убиваем первый процесс:
bash

Это было просто / легко, правда? Один вопрос, который может возникнуть, заключается в том, почему информация о завершении не отображается сразу (как вы видите, требуется дополнительное нажатие ввода), а причина в том, что процесс не был завершен до того, как была возвращена командная строка.
В рамках работы, выполняемой каждый раз перед отображением новой командной строки, является отчет о ряде состояний, включая состояние фонового процесса, если это необходимо. Таким образом, при повторном нажатии клавиши Enter (обозначенной пустой строкой $) отображается отчет о завершенном процессе.

Пример 5: одно сделано раньше другого

Давайте снова запустим два процесса, но на этот раз второй процесс будет спать только на 3 секунды:

Примерно через 5 секунд, нажав Enter, мы увидим:

bash

Что будет теперь, если мы будем использовать fg в этом случае без исходного спецификатора [1]?

Первый процесс будет продолжен! Это также относится к случаю, если использовалась обратная процедура:

$ sleep 10 &
[1] 27346
$ sleep 1000 &
[2] 27347
$
[1]- Done sleep 10
$ fg
sleep 1000
^Z
[2]+ Stopped sleep 1000

Команда fg всегда берет последнюю команду, которая была помещена в фоновый режим (и которая еще не была завершена), и снова помещает ее на передний план.

Заключение

В этой статье мы рассмотрели различные команды linux bash, включая bg, fg и идиому Bash с амперсандом &, которые можно поместить после любой команды, чтобы поместить эту команду в фоновый режим. Мы также изучили пользователя команды kill и посмотрели, как обращаться с различными фоновыми процессами, используя идиому% Bash с соответствующим номером фонового процесса, например %1 для [1] и т. Д.

Наслаждайтесь новыми навыками Bash, и если вы делаете что-то классное с фоновыми процессами, оставьте нам комментарий ниже!

Оригинал статьи можно найти здесь.

Изучай Linux и DevOPS в чат-боте

Все обучение в удобном для тебя ритме. Попробуй бесплатно тут

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Сожалеем, что вы поставили низкую оценку!

Позвольте нам стать лучше!

Расскажите, как нам стать лучше?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Меню

Попробуй курс Linux и DevOPS