Сеансы и группы процессов Linux: управление заданиями

Одним из основных применений сигналов при интерактивной работе пользователя в системе является  механизм управления «заданиями», которыми пользуются командные интерпретаторы и подобные интерактивные программы, например lftp.

Сеансы и группы процессов Linux: управление заданиями

Для удобства управления процессами при помощи сигналов они объединяются в группы и сеансы (см. credentials), проиллюстрированные в листинге ниже при помощи команды ps атрибутами PGID (process group identifier) и SID (session identifier).

Процесс (создавший группу), чей идентификатор PID совпадает с идентификатором PGID, группы, носит название лидера группы.

Процесс (создавший сеанс), чей идентификатор PID совпадает  с идентификатором SID сеанса, называется лидером сеанса. Нужно отметить, что лидер сеанса в столбце STAT отмечается флагом s, а процессы группы переднего фона — флагом +.

Только одна группа сеанса, называемая «терминальной» TGPID, является группой «переднего» (foreground) фона, остальные группы сеанса являются группами «заднего» (background) фона.

Командный интерпретатор формирует свои задания «заднего» О или «переднего» фона ©, Помещая процессы заданий в соответствующие группы. Механизм управления заданиями всегда посылает «терминальные» сигналы ^C SIGINT, ^\SIGQUIT всем процессам текущей «терминальной» группы.

Для смены терминальной группы используется сигнал № 20 SIGTSTP (terminal stop signal), также отсылаемый всем процессам «терминальной» группы при получении драйвером терминала управляющего символа ^Z (SUB), генерируемого клавишами Ctrl+Z.

Обработчик сигнала SIGTSTP по умолчанию приостанавливает процессы, и управление возвращается к командному интерпретатору ©, группа которого, становится «терминальной». При помощи встроенных команд fg (foreground), bg (background) можно продолжить (SIGCONT) выполнение указанного задания (всех процессов .его группы) на «переднем» или «заднем» фоне, а при помощи команды jobs -l получить список всех заданий вместе с номерами их групп процессов.

Сеансы и группы процессов — задания интерпретатора

fitz@ubuntu:~$ dd tf=/dev/zero of=/dev/null &

[1] 3181

fitz@ubuntu:~$ ps jf

PPID        PID      PGID       SID       TTY               TPGID    STAT     UID    TIME   COMMAND
3094        3099     3099      3099      pts/0            3159         Ss          1000    0:00    bash
3099        3181      3181       3099      pts/0            3182          R          1000     0:08     \_ dd if=/dev/zero of=…
3099        3182     3182       3099      pts/0            3182          R+        1000     0:00     \_ ps jf

fitz@ubuntu:~$ man dd

Ctrl+Z
[2]+ Остановлено man dd

fitz@ubuntu:~$ jobs -l
[1] — 3181 Выполняется dd if=/dev/zero of=/dev/null &
[2] + 3193 Остановлено man dd
fitz@ubuntu:~$ ps jf
PPID        PID      PGID       SID       TTY               TPGID    STAT     UID    TIME   COMMAND

3094        3099    3099       3099     pts/0             3310        Ss            1000    0:00   bash
3099        3181     3181        3099      pts/0            3310        R             1000     4:48     \_ dd if=/dev/zero of=
3099        193       3193        3099      pts/0            3310        T             1000     0:00     \_ man dd
3193        3203     3193        3099      pts/0            3310        T             1000     0:00    |      \_ pager -s
3099       3310     3310         3099     pts/0            3310        R+           1000    0:00    \_ ps jf

fitz@ubuntu:~$ fg %1

dd if=/dev/zero of=/dev/null

^Z
[1]+ Остановлено dd if=/dev/zero of=/dev/null

fitz@ubuntu:~$ ps f

PID   TTY          STAT       TIME     COMMAND
3099     pts/0       Ss              0:00      bash
3181      pts/0       T                26:44       \_ dd if=/dev/zero of=/dev/null
3193      pts/0       T                 0:00      \_ man dd
3203     pts/0       T                 0:00      |         \_ pager -s
3937      pts/0      R+              0:00       \_ ps f

fitz@ubuntu:~$ bg 1

[1]+ dd if=/dev/zero of=/dev/null &

fitz@ubuntu:~$ fg %2
Q
man dd
fitz@ubuntu:~$ jobs
[1]+ Остановлено ddif=/dev/zero of=/dev/null

fitz@ubuntu:~$ fg
dd if=/dev/zero of=/dev/null |
^C11771330744+0 записей получено

11771330743+0 записей отправлено
скопировано 6026921340416 байт (6,0 ТВ), 8400,83 с, 717 МВ/с

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

Поэтому ввод (input) разрешен только процессам группы «переднего» фона, а группа формируется так, что только один из них в реальности будет производить чтение.

Процессам группы «заднего» фона ввод запрещен, а любые попытки подавляются при помощи сигнала SIGTTIN (terminal stop on input signal), доставка которого, приводит к приостановке процесса.

В примере из листинга ниже при составлении текста письма посредством команды mail ее процесс был временно приостановлен при помощи ^Z и SIGTSTP для получения доступа к командному интерпретатору.

Попытка продолжить в выполнение задания mail на «заднем» фоне не увенчалась успехом, т. к. была подавлена за чтение терминала. Продолжение задания на «переднем» фоне дает возможность закончить ввод текста, письма и завершить ввод управляющим символом ^Z (EOT).

Приостановка при вводе из заднего фона (SIGTTIN)

fitz@ubuntu:~$ mail alevin@gmail.com
Subject: schedtool вместо taskset, chrt и nice/renice
^Z
[2]+ Остановлено mail alevin@gmail.com

fitz@ubuntu:~$ which schedtool

/usr/bin/schedtool
fitz@ubuntu:~$ dpkg -S /usr/bin/schedtool

schedtool: /usr/bin/schedtool

fltz@ubuntu:~$ bg

[1]+ mail mail alevin@gmail.com &
(continue)
fitz@ubuntu:~$ jobs -l
[1]+ 12025 Остановлено (ввод с терминала)

fitz@ubuntu:~$ ps fj

PID    TTY            STAT        TIME    COMMAND
8992       pts/2          Ss              0:00     bash
12025     pts/2          T                0:00      \_ mail alevin@gmail.com

12063     pts/2          R+             0:00     \_ ps f
8897       pts/0          Ss+           0:00     bash
fitz@ubuntu:~$ fg mail alevin@gmail.com

(continue)

Утилита schedtoolиз одноименного пакета schedtool заменяет «стандартные» taskset/nice/renlce/chrt↵

^D

Cc:↵

fitz@ubuntu:~$

При «одновременном» выводе информации на один терминал несколькими процессами результат точно так же непредсказуем, как и при вводе. В итоге будет получена смесь перемежающихся строчек разных процессов, однако по умолчанию вывод (output) разрешен как процессам группы «переднего» фона, так и процессам всех групп «заднего» фона.

Настроечный флаг драйвера терминала tostop (terminal output stop) позволяет запретить вывод из заднего фона так же, как и ввод. При запрещенном выводе из заднего фона все попытки будут подавляться сигналом SIGTTOU (terminal stop on output signal), приостанавливающим процесс. В листинге ниже проиллюстрировано действие сигнала SIGTTOU при включении настроечного флага tostop посредством команды stty.

Приостановка при выводе из заднего фона (SIGTTOU)

fitz@ubuntu:~$ find / -type f -size 0 &
. . .                   ^C              . . .               ^\            . . .           ^Z             . . .                        . . .
fitz@ubuntu:~$ stty -a
speed   38400   baud;   rows 24;   columns 80;   line = 0;
isig  icanon  iexten  echo … -echonl  -nofish  -xcase  -tostop  -echoprt  ecboctl  echoke

fitz@ubuntu:~$ stty tostop

fitz@ubuntu:~$ find / -type f -size 0 &
[1] 356
fitz@ubuntu:~$ jobs -l
[1]+ 356 Остановлено (вывод на терминал)                                                                find / -type f -size 0
fttz@ubuntu:~$ ps f

PID   TTY          STAT    TIME    COMMAND
32535    pts/1         S           0:00      -bash
356         pts/1        T            0:00        \_ find / -type f -size 0
360         pts/1        R+         0:00        \_ ps f

 

Сеансы и группы процессов Linux: управление заданиями: 1 комментарий

  1. Уведомление: Списки команд командного интерпретатора Linux | Debian GNU/Linux

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