Команда nohup: использование, nohup.out и работа после закрытия терминала
Чтобы задача продолжала работать после закрытия терминала или обрыва 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] 3432892jobs -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 -1nohup (GNU coreutils) 8.32nohup --version | head -1nohup (GNU coreutils) 9.12️⃣ nohup.out и перенаправление вывода
Если не указать, куда идёт вывод, 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.outstart
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] 3432059cat job.lognohup: 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 показывает только задания, запущенные из текущей оболочки, поэтому после закрытия терминала и повторного подключения проверяйте процесс 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 3431609kill ничего не вывел, а при следующем запуске jobs задание показалось как Terminated и затем исчезло из списка.
jobs[1]+ Terminated nohup sleep 300Повторный ps с тем же PID показал только заголовок, что подтвердило завершение процесса.
ps -p 3431609 -o pid,stat,etime,cmd PID STAT ELAPSED CMDnohup игнорирует только сигнал разрыва связи, поэтому даже отправка того же сигнала напрямую через [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: сравнение и параметры
🔲 Сравнение nohup и disown
disown — встроенная команда bash для уже запущенных заданий: она позже отделяет задание, запущенное через & без nohup, от сигнала разрыва связи терминала. disown не перенаправляет вывод в nohup.out, поэтому для задания с выводом сразу при запуске укажите, куда он пойдёт, через > файл.
Согласно официальному руководству Bash, disown без параметров убирает задание из списка jobs, а disown -h оставляет его в списке и только не даёт сигналу разрыва связи дойти до него. Сначала запустили sleep 302, затем выполнили disown.
sleep 302 &[1] 3433230disowndisown ничего не вывел, и выполненный сразу после него jobs -l тоже вернул пустой результат.
jobs -lЗатем запустили sleep 303 и выполнили disown -h для задания с номером %1.
sleep 303 &[1] 3433343disown -h %1Проверка через jobs -l показала, что задание по-прежнему в списке.
jobs -l[1]+ 3433343 Running sleep 303 &Дополнительно запустили ещё sleep 304 без всякой обработки, закрыли терминал и из другой оболочки проверили три PID.
sleep 304 &[2] 3433474ps -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, закрыть терминал и переподключиться кнопкой 🔌 и самим увидеть, какие процессы остаются.
🔢 FAQ & рекомендуемые материалы
Планирование задач
Linux: настройка crontab
Настройка crontab — планировщика Linux, который регистрирует задачи для повторения в заданное время, например резервное копирование или очистку журналов.
Процессы
Команда top в Linux (проверка загрузки CPU и памяти)
Команда top показывает использование процессора и памяти по процессам в реальном времени.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.