Управление задачами (Job Control)


Управление задачами (Job Control)

Shell позволяет послать процессу сигнал SIGSTOP нажатием Ctrl+Z.

Если так поступить, процесс приостановит работу и пользователю вернётся контроль над shell-ом:

cat

когда нажали Ctrl+Z

## вывод
^Z
[1]+  Stopped                 cat

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

ps
## вывод
    PID TTY          TIME CMD
  18615 pts/12   00:00:00 bash
  18648 pts/12   00:00:00 cat
  18649 pts/12   00:00:00 ps

Управление задачами (Job Control): fg

Процесс можно снова разбудить командой fg:

fg

будет открыт cat:

cat

при нажатии Ctrl + C отправим SIGTERM

^C

нам вернётся управление (prompt может быть другим):

$

Если в фоне несколько процессов, будет разбужен какой-то один из них (обычно последний активный).


Управление задачами (Job Control): bg

Иначе, процессу можно поручить продолжать выполняться, но, не отнимая управление шеллом, с помощью bg:

ping 8.8.8.8
## вывод
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=45 time=6.03 ms
^Z
[1]+  Stopped                 ping 8.8.8.8

поставим выполняться в фоне:

bg
## вывод
[1]+ ping 8.8.8.8 &

Управление задачами (Job Control): bg

Терминал будет выглядеть как-то так:

$ l64 bytes from 8.8.8.8: icmp_seq=2 ttl=45 time=11.5 ms
s64 bytes from 8.8.8.8: icmp_seq=3 ttl=45 time=5.76 ms
dotfiles/  Downloads/  unix.md

На этих строках видны попытки посреди вывода ping напечатать и вызвать команду ls.

Это получается, потому что вывод чего-то на экран не перемешивается с вводом. Для того, чтобы этого избежать, достаточно куда-нибудь перенаправить stdout при запуске процесса.
Например, в /dev/null.


Управление задачами (Job Control): jobs

Посмотреть список задач, запущенных данным экземпляром shell-а, с их текущим состоянием можно командой jobs.

Флаг -l говорит также вывести PID:

jobs -l
## вывод
[1]  18691 Stopped                 ping 8.8.8.8
[2]- 18770 Stopped                 ping 127.0.0.1
[3]+ 18774 Stopped (tty input)     cat

Управление задачами (Job Control): jobs

Первое число в этом выводе — номер процесса с точки зрения shell.

Это число можно подать fg и bg, чтобы указать явно, кого будить.

fg 2
## вывод 
64 bytes from 127.0.0.1: icmp_seq=14 ttl=64 time=0.072 ms
64 bytes from 127.0.0.1: icmp_seq=15 ttl=64 time=0.071 ms
64 bytes from 127.0.0.1: icmp_seq=16 ttl=64 time=0.070 ms

Также можно использовать префикс имени процесса:

fg 'ping 1'
## вывод
64 bytes from 127.0.0.1: icmp_seq=14 ttl=64 time=0.072 ms
64 bytes from 127.0.0.1: icmp_seq=15 ttl=64 time=0.071 ms
64 bytes from 127.0.0.1: icmp_seq=16 ttl=64 time=0.070 ms