Команда, запущенная в консоли, слишком долго выполняется? Не проблема, ведь можно просто запустить еще одно окно терминала. Кроме того, существует 6 методов запустить команду консоли в фоновом режиме (background) [1].
Команды Linux - хороший способ взаимодействия с операционной системой, используя терминал (x-terminal-emulator [2], putty, и т. п.). Однако иногда на выполнение поставленной задачи может уйти некоторое время. Это вынуждает пользователей либо ждать в течение некоторого времени, пока процесс завершится, либо вообще запустить новый шелл. К счастью, Linux позволяет запускать команды в фоне с помощью нескольких простых методов.
[Метод 1. Добавление & после команды]
Самый простой способ запустить команду в фоне - добавить в конец команды через пробел символ амперсанда (&). Например, вы можете захотеть запустить в терминале текстовый редактор gedit, и если просто выполнить команду gedit, то вы не сможете использовать эту командную строку шелла, пока не закроете окно редактора. Однако если добавить & к команде, то запустится gedit, и произойдет немедленный возврат в командную строку терминала.
[Метод 2. Использование bg]
Иногда команда выполняется только для того, чтобы выяснить, что требуется гораздо больше времени для её завершения. Такую команду проще всего отправить работать в фоновый режим путем нажатия клавиш Ctrl+Z, после чего можно использовать команду bg. Ctrl+Z остановит запущенный процесс, и командой bg его можно запустить в фоне.
Список запущенных в фоне задач можно посмотреть командой 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.
[Метод 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 запустить команду в фоне.
[Метод 5. Использование disown]
Команда disown упрощает запуск процессов в фоне. Сначала нужно отправить команду на фоновое выполнение, используя &. Затем выполните disown для отсоединения этой команды от текущего шелла.
Основное достоинство disown в том, что как и для nohup, система не прибьет вашу задачу, когда вы закроете её родительский шелл или разлогиньтесь.
[Метод 6. Использование tmux]
Комада tmux это мощный переключатель, который позволяет запустить несколько сессий терминала в одном окне.
tmux new -d 'ping -c 10 8.8.8.8 > output.log'
Когда вы запустите этот пример, команда ping выполнится в отдельном шелле и останется работать в фоновом режиме. С помощью этого метода вы можете запустить в фоне любой процесс Linux или команду.
[Команды, работающие в фоне]
Если вы надолго оставите свои программы в фоновом режиме, они могут стать зомби-процессами, если не будут правильно закодированы. Эти процессы могут значительно замедлить работу системы. Поэтому не забудьте время от времени идентифицировать и убить зомби-процессы.
[Ссылки]
1. How to Run Linux Commands in the Background site:makeuseof.com. 2. Горячие клавиши x-terminal-emulator. |