Блог Синявского
  • Разделы
  • Метки
  • Все статьи

Многозадачность в bash

1

Ручной контроль хода выполнения программ в 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 &


  • ← сюда
  • туда →

comments powered by Disqus

Опубликовано

03.04.2022

Обновление

05.05.2022

Категории

ubuntu

Тэги

  • bash 10
  • console 6
  • ubuntu 36

Всегда на связи

  • Блог Синявского - Ничего не переносить на завтра, это тоже проблема с прокастинацией?
  • © Алексей Синявский, по лицензии CC BY-SA если не указано иное.
  • С использованием Pelican. Тема: Elegant от Talha Mansoor