Управление задачами (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