Команда nohup: использование, nohup.out и работа после закрытия терминала

Тестовая средаСемейство RHELAlmaLinux 9.8coreutils 8.32Учётная запись rootDebian 12 · coreutils 9.1 обычная учётная записьПроверено 2026-11-05
Продолжает работать и после закрытия терминала

Чтобы задача продолжала работать после закрытия терминала или обрыва SSH-соединения, запустите её командой nohup. nohup выполняет команду так, чтобы она игнорировала сигнал разрыва связи (SIGHUP), который приходит при закрытии терминала. Когда на сервере AlmaLinux 9 одновременно запустили sleep с nohup и sleep без него, а затем закрыли терминал, работать остался только запущенный с nohup.

Вывод ниже получен на сервере AlmaLinux 9.8 (учётная запись root) и сервере Debian 12 (обычная учётная запись). Вместо долгой задачи запускался sleep, а при завершении указывался только PID, полученный при запуске. Время выводится в UTC.

1️⃣ Как пользоваться командой nohup

  • ↪️ Знак & в конце и что происходит при закрытии терминала

nohup ставится перед запускаемой командой, а знак & в конце команды задаёт выполнение в фоне. Согласно официальному руководству GNU, сам nohup не отправляет команду в фон, поэтому без & приглашение не вернётся, пока команда не завершится.

nohup sleep 300 &
[1] 3431609
nohup: ignoring input and appending output to 'nohup.out'

[1] — номер задания, а 3431609 — PID запущенного процесса. Следующее сообщение говорит, что ввод с клавиатуры не читается, а вывод дописывается в файл nohup.out.

PID только что запущенного задания хранится в $!, поэтому проверьте его командой [echo $!] сразу после запуска и запишите: этот же номер понадобится, чтобы посмотреть состояние или завершить задание.

echo $!
3431609

При закрытии терминала оболочка получает сигнал разрыва связи и отправляет тот же сигнал заданиям, которые запустила (согласно официальному руководству Bash). Чтобы проверить это, в новом терминале одновременно запустили [nohup sleep 300 &] и, без nohup, [sleep 301 &].

sleep 301 &
[2] 3432892
jobs -l
[1]- 3432883 Running                 nohup sleep 300 &
[2]+ 3432892 Running                 sleep 301 &

Пока оба задания были в состоянии Running, окно терминала закрыли и из другой оболочки проверили оба PID командой ps.

ps -p 3432883,3432892 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3432883 S          00:05 sleep 300

Остался только sleep 300, запущенный с nohup; sleep 301, запущенный без nohup, завершился вместе с закрытием терминала.

Процесс, запущенный с nohup, похож на телефон с включённым режимом «Не беспокоить».

nohup — команда из пакета coreutils. Установленную версию показывает первая строка --version. На сервере AlmaLinux 9.8 была 8.32, на сервере Debian 12 — 9.1.

nohup --version | head -1
nohup (GNU coreutils) 8.32
nohup --version | head -1
nohup (GNU coreutils) 9.1

2️⃣ nohup.out и перенаправление вывода

  • ↪️ Свой файл журнала и /dev/null

Если не указать, куда идёт вывод, nohup дописывает вывод команды в nohup.out в текущей папке. Только что созданный nohup.out имел размер 0 и права -rw-------, то есть чтение и запись только для создавшего его пользователя.

ls -l nohup.out
-rw------- 1 root root 0 Oct 28 23:04 nohup.out

Официальное руководство GNU поясняет, что nohup создаёт nohup.out так, чтобы читать и записывать его мог только создавший его пользователь, независимо от настройки umask. Если записать в текущую папку нельзя, он пишет в $HOME/nohup.out в домашней папке, а если нельзя и туда, команду не выполняет.

Когда команду, которая что-то выводит, запустили через nohup, после её завершения вывод остался в nohup.out.

nohup sh -c 'echo start; sleep 2; echo end' &
[1] 3431985
nohup: ignoring input and appending output to 'nohup.out'
cat nohup.out
start
end
[1]+  Done                    nohup sh -c 'echo start; sleep 2; echo end'

Done в последней строке — уведомление оболочки о том, что задание завершилось. nohup.out не создаётся заново при каждом запуске, а дописывается в конец того же файла, поэтому если запускать несколько заданий из одной папки, их вывод смешается в одном файле.

Чтобы вести отдельный журнал для каждого задания, укажите файл вывода через > и отправьте в тот же файл и вывод ошибок через 2>&1.

nohup sh -c 'echo start; sleep 300' > job.log 2>&1 &
[1] 3432059
cat job.log
nohup: ignoring input
start

С добавленным 2>&1 терминал показал только номер задания и PID, а сообщение nohup [nohup: ignoring input] записалось в первую строку файла журнала.

Если добавить только > и убрать 2>&1, в терминале появится сообщение о том, что вывод ошибок перенаправляется в файл стандартного вывода.

nohup sleep 300 > job2.log &
[2] 3432097
nohup: ignoring input and redirecting stderr to stdout

Вывод заданий, который не нужно сохранять, отправляют в /dev/null. И в этом случае терминал показал только номер задания и PID.

nohup sleep 300 > /dev/null 2>&1 &
[3] 3432137

В таблице ниже показано, куда ушёл вывод и какое сообщение появилось в терминале при каждом из четырёх способов запуска.

Способ запускаКуда идёт выводСообщение в терминале
nohup команда &nohup.out в текущей папкеnohup: ignoring input and appending output to 'nohup.out'
nohup команда > файл &Указанный файл (вместе с выводом ошибок)nohup: ignoring input and redirecting stderr to stdout
nohup команда > файл 2>&1 &Указанный файлНет (сообщение в первой строке файла)
nohup команда > /dev/null 2>&1 &ОтбрасываетсяНет

3️⃣ Проверка и завершение процессов nohup

  • ↪️ jobs, ps, kill

Список jobs показывает только задания, запущенные из текущей оболочки, поэтому после закрытия терминала и повторного подключения проверяйте процесс nohup командой ps -p с указанием PID. Пока вы в той же оболочке, jobs -l показывает номер задания, PID и состояние вместе.

jobs -l
[1]+ 3431609 Running                 nohup sleep 300 &

Если указать PID после ps -p и выбрать столбцы через -o, появится только строка этого процесса. S в STAT означает, что процесс спит в ожидании события, а ELAPSED — время, прошедшее с запуска.

ps -p 3431609 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3431609 S          00:03 sleep 300

Чтобы завершить процесс, используйте kill с PID.

kill 3431609

kill ничего не вывел, а при следующем запуске jobs задание показалось как Terminated и затем исчезло из списка.

jobs
[1]+  Terminated              nohup sleep 300

Повторный ps с тем же PID показал только заголовок, что подтвердило завершение процесса.

ps -p 3431609 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD

nohup игнорирует только сигнал разрыва связи, поэтому даже отправка того же сигнала напрямую через [kill -HUP] процесс не завершает. kill -HUP отправили sleep 305, запущенному с nohup, и sleep 306, запущенному без него.

kill -HUP 3437119 3437128

Следующая проверка через jobs -l показала в состоянии Running только задание с nohup, а sleep 306 завершился с Hangup.

jobs -l
[1]- 3437119 Running                 nohup sleep 305 &
[2]+ 3437128 Hangup                  sleep 306

Если не указать kill сигнал, он отправляет SIGTERM, поэтому задание, запущенное с nohup, тоже завершается через [kill PID].

4️⃣ Команда nohup и disown: сравнение и параметры

  • ↪️ disown -h, когда выбирать tmux, и сводка параметров

🔲 Сравнение nohup и disown

disown — встроенная команда bash для уже запущенных заданий: она позже отделяет задание, запущенное через & без nohup, от сигнала разрыва связи терминала. disown не перенаправляет вывод в nohup.out, поэтому для задания с выводом сразу при запуске укажите, куда он пойдёт, через > файл.

Согласно официальному руководству Bash, disown без параметров убирает задание из списка jobs, а disown -h оставляет его в списке и только не даёт сигналу разрыва связи дойти до него. Сначала запустили sleep 302, затем выполнили disown.

sleep 302 &
[1] 3433230
disown

disown ничего не вывел, и выполненный сразу после него jobs -l тоже вернул пустой результат.

jobs -l

Затем запустили sleep 303 и выполнили disown -h для задания с номером %1.

sleep 303 &
[1] 3433343
disown -h %1

Проверка через jobs -l показала, что задание по-прежнему в списке.

jobs -l
[1]+ 3433343 Running                 sleep 303 &

Дополнительно запустили ещё sleep 304 без всякой обработки, закрыли терминал и из другой оболочки проверили три PID.

sleep 304 &
[2] 3433474
ps -p 3433230,3433343,3433474 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3433230 S          00:11 sleep 302
3433343 S          00:08 sleep 303

Два задания с disown и disown -h остались, завершился только sleep 304 без обработки. Сравнение четырёх способов:

СпособКогда применятьСписок jobsПосле закрытия терминалаВывод
nohup команда &При запускеОстаётсяОстаётсяnohup.out или указанный файл
команда &, затем disownПосле запускаПропускаетсяОстаётсяНе меняется
команда &, затем disown -hПосле запускаОстаётсяОстаётсяНе меняется
Только команда &—ОстаётсяЗавершенаНе меняется

Для работы, где нужно вернуть экран сеанса и продолжить ввод, подходит терминальный мультиплексор, например tmux; для работы, которую запускают один раз и получают только результат в файле, достаточно nohup.

🔲 Параметры команды nohup

📌 Основные опции: результаты из этой статьи

ОпцияНазначениеРезультат в этой статье
--versionВыводит сведения о версии и завершает работуСервер AlmaLinux 9.8: nohup (GNU coreutils) 8.32, сервер Debian 12: nohup (GNU coreutils) 9.1

📎 Другие опции: по официальному руководству

ОпцияНазначение
--helpВыводит справку и завершает работу

🔲 Симулятор команды nohup

В симуляторе ниже можно запустить задание через nohup, закрыть терминал и переподключиться кнопкой 🔌 и самим увидеть, какие процессы остаются.

Симулятор команды nohupcoreutils 8.32
[root@server work]#
Работает только в браузере и не запускает настоящих процессов. Время sleep идёт по настоящим часам, а ↑↓ возвращают ранее введённые команды.

🔢 FAQ & рекомендуемые материалы

Согласно официальному руководству GNU, nohup завершается с кодом 125, если ошибся сам nohup, 126, если команда найдена, но не может быть выполнена, и 127, если команда не найдена. На сервере AlmaLinux 9 ввод одного nohup без команды дал 125, ./job.sh без права на выполнение — 126, а несуществующая команда nosuchcmd — 127.

nohup не меняет значение nice, поэтому используйте вместе с ним nice, например [nohup nice -n 10 sleep 307 &]. Запущенный так sleep в ps показал 10 в столбце NI и SN в STAT — с буквой N, обозначающей низкий приоритет.

У команды nohup всего два параметра: [--help] и [--version]. Согласно официальному руководству GNU, параметры указываются перед запускаемой командой.

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 6   +   5   =