Администрирование сервера под управлением Linux довольно часто сопровождается множественными манипуляциями команд в окне терминала. Это привычная картина для тех, кто администрирует сервера на Linux, и в некоторых случаях удобно выполнять команды в фоновом режиме. Это вполне может быть использовано на практике, и стоит отметить причины, почему это может быть полезным:
— Когда терминал переполняется кучей сообщений, да и выполнять параллельно дополнительные действия не представляется возможным;
— Если вы закрываете терминал, то останавливается текущий процесс, с его дочерними процессами;
Данные проблемы решаются элементарно, говоря простым языком нам необходимо полностью отделить выполняемый процесс от управляющего терминала.
В данном посту мы рассмотрим полезную возможность Linux выполнения команд в фоновом режиме. Иными словами процесс запущенный вами будет выполняться отдельно от управляющего терминала.
Как запускать команды или процессы в фоновом режиме
Если ваш процесс запущен в окне терминала, то приостановить его можно с помощью команды Ctrl+Z, наверное, это многие знают, и подумают, и что с этого. И вот что интересное, приостановив, таким образом, процесс, мы можем продолжить его в фоновом режиме, для этого необходимо ввести команду
$ bg
После ввода этой команды процесс будет продолжен, но уже в фоновом режиме. Чтобы просмотреть все процессы, выполняемые в фоновом режиме, вы можете ввести команду
$ jobs
Давайте просмотрим простой пример, как это можно применить. Предположим у нас есть tar-архив, который нам необходимо распаковать, однако нам некогда ждать, и мы хотим работать параллельно.
Распаковка архива в фоновом режиме
$ tar -czf home.tar.gz .
Жмем Cntr+Z, затем вводим команды
$ bg $ jobs
Второй способ – это добавить символ & в конце команды, это сообщит системе, что нужно выполнять команду в фоновом режиме.
$ tar -czf home.tar.gz . & $ jobs
Подобный способ позволяет выполнять процессы в фоновом режиме, тем не менее, STDIN, STDOUT, STDERR всё ещё связаны с терминалом. Теперь давайте добьемся того, чтобы процесс выполнялся даже при закрытии терминала.
Выполнение процесса после закрытия окна терминала
Чтобы процесс продолжил работать даже после закрытия окна терминала, мы можем использовать команду disown. Она «отцепит» процесс от оболочки окна терминала, после чего будет выполняться даже после закрытия окна консоли.
Давайте рассмотрим пример использования стандартной команды rsync, попробуем выполнить ее в фоновом режиме, и отцепим процесс от терминала.
$ sudo rsync Templates/* /var/www/html/ & $ jobs $ disown -h %1 $ jobs
Вы так же можете использовать команду nohup, она позволит продолжить выполнение процесса даже когда пользователь выходит из оболочки системы.
$ nohup tar -czf iso.tar.gz Templates/* & $ jobs
Как отделить процесс от управляющего терминала Linux
Чтобы полностью отделить процесс от управляющего терминала, можно так же использовать команду, которая будет эффективной при использовании пользовательского графического интерфейса (GUI), к примеру, браузер Firefox.
$ firefox </dev/null &>/dev/null &
В системе Linux (да и практически во всех Unix-системах) /dev/null представляет собой специальный файл устройства, которое так же называют «пустым устройством». Запись в него производиться успешно вне зависимости от объема записанной информации, чтение из него эквивалентно считыванию конца файла (EOF).
Не всегда такое прокатывает. Допустим я хочу слушать музыку в фоне через mplayer. После приостановки ввожу bg - и появляется околесица: ничего не воспроизводится, а mplayer сыпет ошибками