Запуск команд Linux в фоновом режиме Печать
Добавил(а) microsin   

Команда, запущенная в консоли, слишком долго выполняется? Не проблема, ведь можно просто запустить еще одно окно терминала. Кроме того, существует 6 методов запустить команду консоли в фоновом режиме (background) [1].

Команды Linux - хороший способ взаимодействия с операционной системой, используя терминал (x-terminal-emulator [2], putty, и т. п.). Однако иногда на выполнение поставленной задачи может уйти некоторое время. Это вынуждает пользователей либо ждать в течение некоторого времени, пока процесс завершится, либо вообще запустить новый шелл. К счастью, Linux позволяет запускать команды в фоне с помощью нескольких простых методов.

[Метод 1. Добавление & после команды]

Самый простой способ запустить команду в фоне - добавить в конец команды через пробел символ амперсанда (&). Например, вы можете захотеть запустить в терминале текстовый редактор gedit, и если просто выполнить команду gedit, то вы не сможете использовать эту командную строку шелла, пока не закроете окно редактора. Однако если добавить & к команде, то запустится gedit, и произойдет немедленный возврат в командную строку терминала.

gedit &

Commands in Background fig01

[Метод 2. Использование bg]

Иногда команда выполняется только для того, чтобы выяснить, что требуется гораздо больше времени для её завершения. Такую команду проще всего отправить работать в фоновый режим путем нажатия клавиш Ctrl+Z, после чего можно использовать команду bg. Ctrl+Z остановит запущенный процесс, и командой bg его можно запустить в фоне.

Commands in Background fig02

Список запущенных в фоне задач можно посмотреть командой jobs. Использует команду fg, чтобы переключиться обратно на запущенную задачу.

[Метод 3. Использование nohup]

Команда nohup в Linux позволяет админам запустить команды терминала, на которые не влияют сигналы HUP или Hang Up. Вы можете просто запустить команды в фоне, используя команду nohup.

Пример ниже запускает в фоне простое сканирование портов утилитой Nmap.

nohup sudo nmap -sS --top-ports=15 192.168.1.1/24

Одно из ключевых достоинств nohup в том, что ваши команды продолжат работу, даже когда вы завершите окно терминала. Кроме того, во время выполнения генерируются лог-файлы. Посмотрите файл nohup.out в текущей директории, или в директории $HOME.

Commands in Background fig03

[Метод 4. System Redirect]

Вы также можете запустить команды в фоне, используя систему перенаправлений Linux (system redirect). Например, если вы запустите команду ping, как в примере ниже, то ваш шелл запустит её в фоне и немедленно возвратит вам контроль над командной строкой терминала.

ping -c5 8.8.8.8 >output.log 2>&1 &

Ниже показан вывод команды ping, перенаправленный в файл output.log. Вы можете заменить этот файл на /dev/null, если хотите отбросить результат. Порция 2>&1 команды говорит Bash перенаправить любые ошибки в тот же самый файл. Завершающий символ & сигнализирует Bash запустить команду в фоне.

Commands in Background fig04

[Метод 5. Использование disown]

Команда disown упрощает запуск процессов в фоне. Сначала нужно отправить команду на фоновое выполнение, используя &. Затем выполните disown для отсоединения этой команды от текущего шелла.

gedit &
disown

Commands in Background fig05

Основное достоинство disown в том, что как и для nohup, система не прибьет вашу задачу, когда вы закроете её родительский шелл или разлогиньтесь.

[Метод 6. Использование tmux]

Комада tmux это мощный переключатель, который позволяет запустить несколько сессий терминала в одном окне.

tmux new -d 'ping -c 10 8.8.8.8 > output.log'

Commands in Background fig06

Когда вы запустите этот пример, команда ping выполнится в отдельном шелле и останется работать в фоновом режиме. С помощью этого метода вы можете запустить в фоне любой процесс Linux или команду.

[Команды, работающие в фоне]

Если вы надолго оставите свои программы в фоновом режиме, они могут стать зомби-процессами, если не будут правильно закодированы. Эти процессы могут значительно замедлить работу системы. Поэтому не забудьте время от времени идентифицировать и убить зомби-процессы.

[Ссылки]

1. How to Run Linux Commands in the Background site:makeuseof.com.
2. Горячие клавиши x-terminal-emulator.