Введение
Команда nohup в POSIX (компьютер) – это команда POSIX, означающая "не отключаться". Она предназначена для запуска команды таким образом, чтобы она игнорировала сигнал HUP (hangup) и не завершалась при выходе пользователя из системы. Вывод, который обычно отображается в терминале, перенаправляется в файл nohup.out, если перенаправление вывода не было задано заранее.
nohup is a POSIX command which means "no hang up". Its purpose is to execute a command such that it ignores the HUP (hangup) signal and therefore does not stop when the user logs out. Output that would normally go to the terminal goes to a file called , if it has not already been redirected.
Реализация
Некоторые оболочки (например, bash) предоставляют встроенную команду, которая может быть использована для предотвращения отправки или распространения сигнала SIGHUP на существующие задания, даже если они не были запущены с помощью nohup. В bash этого можно добиться с помощью `disown -h job`; использование той же команды без аргументов удаляет задание из таблицы заданий, что также означает, что задание не будет получать сигнал. Перед использованием `disown` для активного задания, его следует остановить с помощью Ctrl+Z, а затем продолжить в фоновом режиме командой `bg`. Другая полезная опция bash — `shopt huponexit`, которая автоматически отправляет сигнал HUP заданиям при нормальном завершении оболочки. Версии nohup для AIX и Solaris имеют опцию `-p`, которая изменяет работающий процесс, заставляя его игнорировать последующие сигналы SIGHUP. В отличие от описанной выше встроенной команды `disown` в bash, `nohup -p` принимает идентификаторы процессов. Эта команда также была портирована на операционную систему IBM i.
Преодоление повешения
Обратите внимание, что использование `nohup` для фоновых задач обычно применяется для предотвращения их завершения при выходе из удаленной SSH-сессии. Другая проблема, которая часто возникает в этой ситуации, заключается в том, что SSH отказывается завершать соединение ("зависает"), поскольку он не хочет терять данные, передаваемые фоновыми задачами. Эту проблему также можно решить, перенаправив все три потока ввода-вывода: $ nohup ./myprogram > foo.out 2> foo.err < /dev/null &
$ nohup ./myprogram > foo. out 2> foo. err < /dev/null &
Также следует отметить, что закрытие SSH-сессии не всегда посылает сигнал HUP зависимым процессам, например, когда не выделен псевдотерминал.
Альтернативы
Терминальный мультиплексор может запускать команду в отдельном сеансе, отсоединенном от текущего терминала, что означает, что если текущий сеанс завершится, отсоединенный сеанс и связанные с ним процессы продолжат выполняться. Позже к этому сеансу можно будет подключиться снова. Например, следующий вызов screen запустит somescript.sh в фоновом режиме отсоединенного сеанса:
$ screen -A -m -d -S somename ./somescript.sh &
Команда disown используется для удаления заданий из таблицы заданий или для пометки заданий, чтобы при завершении сеанса им не отправлялся сигнал SIGHUP.
$ screen A m d S somename ./somescript. sh &
The disown command is used to remove jobs from the job table, or to mark jobs so that a SIGHUP signal is not sent on session termination.