Red Hat System Administration I 8.2

Управление заданиями

Задачи

После завершения этого раздела вы сможете использовать функции управления заданиями Bash для управления несколькими процессами, запущенными из одного и того же сеанса терминала.

Описание заданий и сеансов

Управление заданиями — это функция командной оболочки, которая позволяет одному экземпляру оболочки выполнять несколько команд и управлять ими.

Задание связано с каждым конвейером, введенным в командной строке. Все процессы в этом конвейере являются частью задания и участниками одной группы процессов. Если в командной оболочке введена всего одна команда, ее следует рассматривать как «конвейер» минимальной длины, и эта команда будет единственным участником задания.

Только одно задание может считывать входные данные и сигналы с клавиатуры в одном окне терминала в определенный момент времени. Процессы, входящие в это задание, являются активными процессами для данного управляющего терминала.

Фоновый процесс для данного управляющего терминала является участником любого другого задания, связанного с этим терминалом. Фоновые процессы терминала не могут считывать с терминала входные данные и прерывания, выполненные с клавиатуры, но могут выводить данные на терминал. Задание в фоновом режиме может быть запущено или остановлено (приостановлено). Если выполняющееся фоновое задание попытается считать данные с терминала, оно будет автоматически приостановлено.

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

Команда ps отображает имя устройства для управляющего терминала процесса, указанного в столбце TTY. Некоторые процессы, такие как системные демоны, запускаются системой, а не из командной оболочки. Эти процессы не имеют управляющего терминала, не являются частью задания и не могут быть переведены в активный режим. Команда ps отображает вопросительный знак (?) в столбце TTY для таких процессов.

Запуск заданий в фоновом режиме

Любая команда или конвейер могут быть запущены в фоновом режиме путем добавления амперсанда (&) в конце командной строки. Оболочка Bash отображает номер задания (уникальный для сеанса) и PID нового дочернего процесса. Оболочка не ожидает окончания дочернего процесса, а снова выводит приглашение.

[user@host ~]$ sleep 10000 &
[1] 5947
[user@host ~]$ 

Примечание

Когда командная строка, содержащая конвейер, отправляется в фоновый режим с помощью амперсанда, выводится PID последней команды конвейера. Все процессы конвейера остаются участниками этого задания.

[user@host ~]$  example_command | sort | mail -s "Sort output" &
[1] 5998

С помощью команды jobs можно отобразить список заданий, которые Bash отслеживает для определенного сеанса.

[user@host ~]$ jobs
[1]+  Running                 sleep 10000 &
[user@host ~]$ 

Чтобы перевести фоновое задание в активный режим, необходимо выполнить команду fg с идентификатором этого задания (%номер задания).

[user@host ~]$ fg %1
sleep 10000

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

Чтобы перевести активный процесс в фоновый режим, нажмите клавиши приостановки (Ctrl+z) на терминале.

sleep 10000
^Z
[1]+  Stopped                 sleep 10000
[user@host ~]$ 

Задание немедленно переводится в фоновый режим и приостанавливается.

Команда ps j отображает информацию, относящуюся к заданиям. PID — это уникальный идентификатор процесса. PPID — это PID родительского процесса, который запустил (разветвил) дочерний процесс. PGID — это PID лидера группы процессов, обычно первого процесса в конвейере. SID — это PID лидера сеанса, которым (для задания) обычно является интерактивная оболочка, запущенная на управляющем терминале. Поскольку в примере команда sleep в настоящее время приостановлена, состояние ее процесса — T.

[user@host ~]$ ps j
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 2764  2768  2768  2768 pts/0     6377 Ss    1000   0:00 /bin/bash
 2768  5947  5947  2768 pts/0     6377 T     1000   0:00 sleep 10000
 2768  6377  6377  2768 pts/0     6377 R+    1000   0:00 ps j

Чтобы запустить приостановленный процесс, который выполняется в фоновом режиме, выполните команду bg с тем же идентификатором задания.

[user@host ~]$ bg %1
[1]+ sleep 10000 &

Оболочка выдаст предупреждение пользователю, если он попытается выйти из окна терминала (сеанса) с приостановленными заданиями. Если пользователь тут же снова попытается выйти, приостановленные задания будут удалены.

Примечание

Обратите внимание на знак + после [1] в приведенных выше примерах. Знак + указывает, что это текущее задание по умолчанию. То есть, если используемой команде требуется аргумент %номер задания, но номер задания не указан, будет выполняться действие для задания с индикатором +.

Ссылки

Страница информации о Bash (Справочное руководство по GNU Bash) https://www.gnu.org/software/bash/manual

  • Раздел 7. Управление заданиями

Man-страницы bash(1), builtins(1), ps(1), sleep(1)