Я знаю, что, nohup
будучи бинарным, он доступен из любой оболочки. Но exec
встроенный, вероятно, существует в каждой оболочке.
Есть ли причина предпочесть один из них другому?
решение1
Что лучше, рыба или велосипед? nohup
и exec
делать разные вещи.
exec
заменяет оболочку другой программой. Использование exec
в простом фоновом задании бесполезно: exec myprogram; more stuff
заменяет оболочку myprogram
и поэтому не запускает more stuff
, в отличие от myprogram; more stuff
который запускается more stuff
при myprogram
завершении; но exec myprogram & more stuff
запускается myprogram
в фоновом режиме и затем запускает more stuff
, как myprogram & more stuff
.
nohup
запускает указанную программу с игнорированием сигнала SIGHUP. Когда терминал закрыт, ядро отправляет SIGHUP управляющему процессу в этом терминале (т. е. оболочке). Оболочка, в свою очередь, отправляет SIGHUP всем работающим в фоновом режиме заданиям. Запуск задания с nohup
предотвращает его завершение таким образом, если терминал умирает (что происходит, например, если вы вошли в систему удаленно и соединение разорвано, или если вы закрываете эмулятор терминала).
nohup
также перенаправляет вывод программы в файл nohup.out
. Это позволяет избежать сбоя программы из-за того, что она не может записать в свой вывод или вывод ошибок. Обратите внимание, что это nohup
не перенаправляет ввод. Чтобы полностью отключить программу от терминала, где вы ее запустили, используйте
nohup myprogram </dev/null >myprogram.log 2>&1 &
решение2
exec &
=> выполняет процесс в фоновом режиме, чтобы вы могли продолжать использовать тот же терминал для других задач.
nohup
=> избегает всех SIGHUP (сигналов завершения) и продолжает выполнение, даже если терминал закрыт.
exec
процесс завершается при SIGHUP
получении a, но nohup
процесс продолжается.
решение3
Встроенная команда оболочки exec <command>
заменяет оболочку на <command>
, не создается новый процесс, не создается новый PID. После завершения <command>
обычно ваш терминал закроется. При запуске в фоновом режиме сначала создается подоболочка, которая затем аналогичным образом немедленно заменяется на <command>
.
Команда nohup <command>
будет запущена <command>
, но невосприимчива к зависаниям (kill -s 1), поэтому она не будет завершена, когда оболочка, терминал, из которого она была запущена, будет закрыта. При запуске ее в фоновом режиме сначала создается подоболочка, и команда запускается в фоновом режиме, возвращая вас к приглашению.
В скриптах немедленный эффект более или менее тот же: <command>
скрипт запускается вашим скриптом, и он продолжает работу, не дожидаясь <command>
запуска, отправки вывода или завершения.
решение4
Вы не можете сравниться nohup
с exec
. Когда вы запускаете исполняемый файл с nohup
, процесс не будет завершен при выходе из системы (ssh-сессия); обычно nohup
используется с nice
для запуска процессов с более низким приоритетом. HUP
Сигнал, по соглашению, является способом, которым терминал предупреждает зависимые процессы о выходе из системы