nohup (сокращение от «no hangup») — это команда в операционных системах Linux, которая запускает процессы выполняемых команд таким образом, что они остаются активными после закрытия терминала консоли.
На уровне технической реализации nohup предотвращает распространение системного сигнала SIGHUP (Signal Hang UP), задача которого — сообщать запущенным процессам о потере соединения с управляющим терминалом пользователя.
Скажем так, когда вы подключаетесь к удаленному серверу по SSH, запускаете команду, которая выполняется некоторое время, и сразу же отключаетесь от терминала, то команда прекращает свое выполнение — процесс, который ее выполняет, будет остановлен.
Избежать этого можно с помощью nohup. Синтаксис команды довольно простой:
Таким образом при использовании nohup указывается:
-
[команда]— название команды или путь до shell-скрипта. -
[аргументы](необязательно) — аргументы или флаги, которые передаются указанной для запуска команде. -
&(необязательно) — знак амперсанда, указывающийnohupзапустить процесс команды в фоновом режиме.
Дополнительно можно использовать (необязательно) знаки перенаправления вывода в произвольный файл.
В этом случае синтаксис команды становится следующим:
VDS и VPS
биллингом по всему миру: Россия, Азия и Европа.
Версия Nohup
Перед работой с командой сперва необходимо проверить версию установленного nohup:
Можно также использовать короткий способ записи:
Если nohup присутствует в системе, в консоли появится примерно такой вывод:
Как видно, в этом руководстве используется nohup версии 8.32, которая работает на операционной системе Ubuntu 22.04.
Кстати, системную справку о команде можно получить так:
Дополнительно можно просмотреть полноценную документацию в формате Texinfo прямо в терминале консоли:
Запуск процесса
Давайте запустим простой процесс, выводящий состояние текущего каталога, через nohup:
В консоли появится информирующее (то есть не являющееся ошибкой) сообщение о том, что вывод указанной команды будет перенаправлен в файл nohup.out:
Давайте удостоверимся, что это действительно так:
В консоли появится список существующих файлов и каталогов:
Теперь выведем содержимое нового файла:
В консоли появится следующий список:
Обратите внимание, что файл nohup.out был создан перед выполнением команды ls. В противном случае сохраненный консольный вывод был бы таким:
В созданный файл автоматически записываются выходные данные двух стандартных потоков:
-
stdout— стандартный поток вывода. -
stderr— стандартный поток ошибок.
В этом примере команда ls выполняется однократно — нет никакого смысла запускать ее через nohup. Поэтому имеет смысл рассмотреть запуск процесса, выполнение которого будет достаточно продолжительным, чтобы успеть выйти из консольного терминала и вернуться обратно.
Например, мы могли бы сымитировать долгое выполнение команды с помощью собственного shell-скрипта, представляющего собой обычный таймер.
Давайте создадим его:
Внутри будет цикл, ведущий обратный отсчет каждую секунду:
Также важно не забыть сделать созданный скрипт исполняемым файлом, чтобы не было ошибки при запуске:
Теперь запустим скрипт, чтобы протестировать его работу:
В терминале консоли каждую секунду начнут появляться числа от 10 до 1. Общий вывод будет таким:
Чтобы в дальнейшем не было путаницы, удалим ранее созданные файлы с выводами:
Теперь можно запустить созданный скрипт через nohup:
Как только начнется обратный отсчет, можно закрыть консольный терминал и вернуться в него уже через 10 секунд, выполнив переподключение к удаленному серверу через SSH.
Далее посмотрим содержимое файла с выводом:
Внутри будет все та же последовательность чисел:
Таким образом, запущенный процесс продолжал обратный отсчет даже после отключения пользователя от терминала консоли.
Запуск процесса в фоновом режиме
С помощью nohup продолжительно выполняющийся процесс можно запустить в фоновом режиме. Это означает, что он будет активен и когда мы будем выполнять другие команды, и когда мы выйдем из консольного терминала, и когда мы в него вернемся.
Для примера можно запустить утилиту диагностики сети ping, которая будет регулярно отправлять запрос на сайт Timeweb Cloud.
Давайте сперва протестируем отправку запроса без nohup:
В консоли появится следующий вывод:
При этом последняя строчка будет продолжать выводиться в терминал каждую секунду, информируя о результате очередного запроса:
Заранее очистим файл с консольными выводами:
Для запуска процесса в фоновом режиме через nohup после аргументов команды нужно указать символ амперсанда:
В консоли появится следующий вывод:
Набор цифр в начале является идентификатором запущенного процесса.
Теперь можно выйти из консольного терминала и снова в него зайти.
Чтобы убедиться в том, что запущенный процесс до сих пор активен, нужно запросить список рабочих процессов:
В консоли появится строка с идентификатором, именем и аргументом запущенного процесса:
Впоследствии с помощью этого идентификатора процесс можно будет остановить.
Кстати, для просмотра запущенных процессов можно воспользоваться другой командой:
Фактически тут используется конвейер из двух команд:
-
ps aux— выводит список всех процессов. -
grep ping— находит в списке из вывода строку с ключевым словом «ping».
В консоли появится примерно такой вывод:
В данном случае первая строчка — искомый процесс.
Кстати, можно смотреть за записью вывода в файл в режиме реального времени:
Команда tail выводит последние строки указанного файла, а дополнительный флаг -f позволяет делать вывод в режиме реального времени в момент дополнения файла другими процессами.
Поэтому в консоли появятся строки с результатами удаленных запросов, которые будут дополняться новым выводом запущенного процесса:
Фактически таким образом можно записывать консольный вывод в произвольный файл и одновременно показывать его в терминале.
Остановка процесса
Чтобы остановить запущенный процесс, нужно указать его идентификатор:
Теперь, если проверить список активных процессов, вывод будет пуст:
Либо можно снова воспользоваться другим способом поиска процессов:
Тогда в выводе будет содержаться только процесс grep, который запускается для целей поиска:
Теперь, можно взглянуть на сохраненный в файле консольный вывод.
Вывод будет примерно таким:
Таким образом, запущенный процесс продолжает работать и записывать вывод в отдельный файл вне зависимости от активности консольного терминала.
Запуск нескольких процессов в фоновом режиме
Помимо прочего, через nohup можно выполнять несколько команд в фоновом режиме.
Давайте сперва очистим ранее сохраненный вывод:
А потом запустим сразу 2 процесса в фоновом режиме:
Обратите внимание, что в конце команды аналогично стоит знак амперсанда.
В этом примере у нас сперва отработает таймер (на это уйдет 10 секунд), после чего начнется регулярный цикл отправки удаленных запросов.
Поэтому, подождав около 15 секунд (в это время можно также попробовать закрыть и снова открыть терминал консоли), выведем файл с сохраненным консольным выводом:
Содержимое внутри будет примерно таким:
То есть внутри файла nohup.out находится комбинируемый последовательный вывод — сначала отсчет таймера, потом череда удаленных запросов. Таким образом, указанные команды запускаются последовательно.
Поэтому точно так же можно запустить три и более команд:
В этоv случае новый записанный вывод будет примерно таким:
Перенаправление вывода
По умолчанию команда nohup записывает вывод в файл nohup.out. Тем не менее, при запуске процесса можно в явном виде указать файл для перенаправления вывода с помощью знака перенаправления:
В консоли появится сообщение о перенаправлении потока ошибок и вывода:
Проверим состояние файловой системы:
Как видно, появился ранее указанный файл:
Теперь посмотрим его содержимое:
Как видно, оно аналогично всем предыдущим выводам:
Схожим образом работает перенаправление вывода для процессов в фоновом режиме:
Обратите внимание, что амперсанд указывается после перенаправления вывода.
Процесс таймера будет автоматически уничтожаться после завершения таймера — вручную ничего останавливать не надо.
А теперь давайте посмотрим на поведение команды nohup при указании амперсанда перед перенаправлением.
Сперва удалим все существующие файлы с консольным выводом:
И выполним такую команду:
В консоли появится стандартный вывод, сообщающий о создании фонового процесса.
Проверим состояние файловой системы:
Как видно, у нас появились два новых файла — myout1 и nohup.out:
Тем не менее, запись будет выполняться только в nohup.out, а файл myout1 создался исключительно потому, что было явно указано перенаправление.
Содержимое myout1 будет пустым:
А вот если проверить nohup.out:
То внутри него окажется привычный вывод отсчета таймера:
Поэтому важно всегда указывать символ амперсанда (&) в конце каждой командной строки, если требуется запускать процесс в фоновом режиме.
Также не забывайте контролировать активные процессы — не допускайте их дублирования, завершайте лишние и прорабатывайте механизмы автоматической остановки запущенных программ.
Это позволит избежать утечек вычислительных ресурсов и повысить безопасность разворачиваемых инфраструктур.
Отличие nohup от демона
Может возникнуть закономерный вопрос: чем nohup отличается от классического демона в Linux? На первый взгляд может показаться, что это одно и то же.
Особенность демонов в том, что они постоянно работают в фоновом режиме. Очень продолжительное время. Неделями и месяцами. По сути, всегда. Например, это могут быть HTTP-серверы или базы данных. Устройство процессов-демонов всегда сложнее — это не одноразовые скрипты.
Напротив, nohup предназначен для одноразового использования. Обычно это некий сценарий, который выполняется продолжительно (минуты или часы), но все равно завершается.
Например, это может быть процесс, сортирующий какие-то данные, или выполняющий последовательность удаленных запросов. Такие задачи однократны, но занимают время — было бы неудобно оставлять терминал открытым.
То есть с помощью nohup можно выполнять несколько долгих задач в фоновом режиме, занимаясь в это время другими делами.
Команда nohup — это не про запуск бесконечных демонов. Это про однократные, но долгие задачи.
Подготовили для вас выгодные тарифы на облачные серверы
477 ₽/мес
657 ₽/мес
Заключение
Команда nohup — встроенный в операционные системы Linux инструмент для выполнения процессов, не зависящих от состояния консольного терминала.
Таким образом nohup позволяет выполнять команды даже после отключения пользователя от системы, в том числе запускать процессы в фоновом режиме. В этом случае любой консольный вывод перенаправляется в произвольный файл — либо стандартный, либо явно указанный.
Однако важно помнить, что nohup не подходит для создания демонов — регулярно работающих процессов в фоновом режиме. Команда nohup — это про однократное или спорадическое выполнение продолжительных задач: удаленных запросов, выполнения сортировки, обработки файлов и так далее.
