Ручной контроль хода выполнения программ в bash и ksh
Linux - это многозадачная операционная система, которая позволяет запускать параллельно разные процессы. При этом каждая запущенная программа по-умолчанию привязывается к той консоли из которой она была задана. То есть в интерактивном режиме - позволяющим взаимодействовать с программой. Оболочка bash
позволяет процесс перевести в фоновый режим.
Процессы в интерактивном режиме
Это любая команда или задача, которую вы запускаете и ждете ее завершения. Некоторые процессы в интерактивном режиме отображают пользовательский интерфейс, через который обеспечивается взаимодействие с пользователем, в то время как другие программы не имеют вывода и «замораживают» компьютер, пока процесс не завершится.
Интерактивный режим работы начинается с ввода команды в консоли в оболочке. Например, чтобы проверить связь с локальным хостом по протоколу icmp выполните команду:
$ ping 127.0.0.1
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.010 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.010 ms
...
Это бесконечная команда, пока компьютер шлёт запросы и отвечает, вы не можете ничего делать из командной строки.
После того, как вы нажмете Ctrl-c
- завершить процесс, вы снова получите приглашение от оболочки к вводу команды.
Создается впечатление, что система не поддерживает многозадачность, но это не так. Во-первых, в linux есть переключение между TTY консолями Ctrl+Alt+Fn
, где n - это номер консоли от 1 до 12.
Во-вторых, любой процесс можно остановить или перевести в фоновый режим.
Важно помнить, что linux поддерживает лишь одну интерактивно запущенную программу на один виртуальный терминал.
Процессы в фоновом режиме
В отличие от интерактивного режима, пользователю не нужно ждать завершения текущего процесса, прежде чем он сможет запустить другие процессы. В пределах доступного объема памяти вы можете вводить множество фоновых команд одну за другой. Чтобы запустить команду как фоновый процесс, введите команду и добавьте пробел и амперсанд в конце команды. Например:
$ ping 127.0.0.1 &> /dev/null &
В данном примере последним мы отвязали command &
от текущей консоли. Чтобы экран не засорялся мы перенаправили весь вывод в устройство &>/dev/null
или можно в лог файл перенаправить.
$ ping 127.0.0.1 &>/tmp/ping.log &
[1] 359407
При запуске в фоновом режиме оболочка написала идентификатор процесса.
Посмотреть вывод команды ping
можно выполнив команду:
$ tail -f /tmp/ping.log
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.010 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.010 ms
...
Переключение между режимами
Выполним команду ping
в интерактивном режиме:
$ ping 127.0.0.1
Для остановки выполнения задачи используется комбинация клавиш Ctrl-z
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.010 ms
^Z
[1]+ Stopped ping 127.0.0.1
Мы видим что процессу присвоен идентификатор %1
. Посмотреть задачи можно командой jobs
$ jobs
[1]+ Stopped ping 127.0.0.1
Для возобновления процесса используется команда fg
(foreground) - передний план.
То есть перевести в интерактивный режим. Полный синтаксис fg <номер> или <название>
или если не указан номер или название, то это будет последний остановленный процесс.
Для запуска выполнения остановленного процесса в фоновом режиме необходимо выполнить команду bg
.
$ fg %ping
Можно использовать следующие идентификаторы %1, %+, %%
Дополнительные команды
top
просмотр списка задач, с ресурами которые выделены процессам, утилизация процессорного времени и памяти.
nice
и renice
- для изменения приоритета выполнения процессов.
Комбинации клавиш
Ctrl-c - Принудительно прерывает выполнение программы в интерактивном режиме (SIGINT)
Ctrl-z - Программа переводится в фоновый режим и приостанавливается (SIGTSTP)
Ctrl-d - завершение ввода пользователя, или выход из оболочки (EOF)
Ctrl-s - Остановить вывод
Ctrl-q - Возобновить вывод
Ctrl-o - Отказаться от вывода
Ctrl-l - Очистить экран
Схема переключения
Команда nohup
Коллеги попросили включить в описание команду nohup
nohup command arguments &
nohup
- используется для отвязывания от консоли. При этом программа не завершится при выходе пользователя из терминала.
используется, например для запуска сервера в фоновом режиме:
$ nohup nginx -c /etc/nginx/nginx.conf > /dev/null 2>&1 &