Почему следует использовать «nohup &» вместо «exec &»

Почему следует использовать «nohup &» вместо «exec &»

Я знаю, что, 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Сигнал, по соглашению, является способом, которым терминал предупреждает зависимые процессы о выходе из системы

Связанный контент