После завершения этого раздела вы сможете использовать функции управления заданиями Bash для управления несколькими процессами, запущенными из одного и того же сеанса терминала.
Управление заданиями — это функция командной оболочки, которая позволяет одному экземпляру оболочки выполнять несколько команд и управлять ими.
Задание связано с каждым конвейером, введенным в командной строке. Все процессы в этом конвейере являются частью задания и участниками одной группы процессов. Если в командной оболочке введена всего одна команда, ее следует рассматривать как «конвейер» минимальной длины, и эта команда будет единственным участником задания.
Только одно задание может считывать входные данные и сигналы с клавиатуры в одном окне терминала в определенный момент времени. Процессы, входящие в это задание, являются активными процессами для данного управляющего терминала.
Фоновый процесс для данного управляющего терминала является участником любого другого задания, связанного с этим терминалом. Фоновые процессы терминала не могут считывать с терминала входные данные и прерывания, выполненные с клавиатуры, но могут выводить данные на терминал. Задание в фоновом режиме может быть запущено или остановлено (приостановлено). Если выполняющееся фоновое задание попытается считать данные с терминала, оно будет автоматически приостановлено.
Каждый терминал имеет собственный сеанс и может иметь активный процесс и любое количество независимых фоновых процессов. Задание относится только к одному сеансу, который принадлежит своему управляющему терминалу.
Команда ps отображает имя устройства для управляющего терминала процесса, указанного в столбце TTY. Некоторые процессы, такие как системные демоны, запускаются системой, а не из командной оболочки. Эти процессы не имеют управляющего терминала, не являются частью задания и не могут быть переведены в активный режим. Команда ps отображает вопросительный знак (?) в столбце TTY для таких процессов.
TTY
?
Любая команда или конвейер могут быть запущены в фоновом режиме путем добавления амперсанда (&) в конце командной строки. Оболочка Bash отображает номер задания (уникальный для сеанса) и PID нового дочернего процесса. Оболочка не ожидает окончания дочернего процесса, а снова выводит приглашение.
&
[user@host ~]$ sleep 10000 & [1] 5947 [user@host ~]$
[user@host ~]$
sleep 10000 &
Когда командная строка, содержащая конвейер, отправляется в фоновый режим с помощью амперсанда, выводится PID последней команды конвейера. Все процессы конвейера остаются участниками этого задания.
[user@host ~]$ example_command | sort | mail -s "Sort output" & [1] 5998
example_command | sort | mail -s "Sort output" &
С помощью команды jobs можно отобразить список заданий, которые Bash отслеживает для определенного сеанса.
[user@host ~]$ jobs [1]+ Running sleep 10000 & [user@host ~]$
jobs
Чтобы перевести фоновое задание в активный режим, необходимо выполнить команду fg с идентификатором этого задания (%номер задания).
%
номер задания
[user@host ~]$ fg %1 sleep 10000
fg %1
В вышеприведенном примере команда sleep теперь выполняется в активном режиме управляющего терминала. Сама оболочка снова становится неактивной, ожидая завершения дочернего процесса.
Чтобы перевести активный процесс в фоновый режим, нажмите клавиши приостановки (Ctrl+z) на терминале.
sleep 10000 ^Z [1]+ Stopped sleep 10000 [user@host ~]$
Задание немедленно переводится в фоновый режим и приостанавливается.
Команда ps j отображает информацию, относящуюся к заданиям. PID — это уникальный идентификатор процесса. PPID — это PID родительского процесса, который запустил (разветвил) дочерний процесс. PGID — это PID лидера группы процессов, обычно первого процесса в конвейере. SID — это PID лидера сеанса, которым (для задания) обычно является интерактивная оболочка, запущенная на управляющем терминале. Поскольку в примере команда sleep в настоящее время приостановлена, состояние ее процесса — T.
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
ps j
Чтобы запустить приостановленный процесс, который выполняется в фоновом режиме, выполните команду bg с тем же идентификатором задания.
[user@host ~]$ bg %1 [1]+ sleep 10000 &
bg %1
Оболочка выдаст предупреждение пользователю, если он попытается выйти из окна терминала (сеанса) с приостановленными заданиями. Если пользователь тут же снова попытается выйти, приостановленные задания будут удалены.
Обратите внимание на знак + после [1] в приведенных выше примерах. Знак + указывает, что это текущее задание по умолчанию. То есть, если используемой команде требуется аргумент %номер задания, но номер задания не указан, будет выполняться действие для задания с индикатором +.
+
[1]
Страница информации о Bash (Справочное руководство по GNU Bash) https://www.gnu.org/software/bash/manual
Раздел 7. Управление заданиями
Man-страницы bash(1), builtins(1), ps(1), sleep(1)
bash
builtins
ps
sleep