Одним из основных применений сигналов при интерактивной работе пользователя в системе является механизм управления «заданиями», которыми пользуются командные интерпретаторы и подобные интерактивные программы, например lftp.
Для удобства управления процессами при помощи сигналов они объединяются в группы и сеансы (см. 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 | Debian GNU/Linux