В чем разница между nohup и демоном?

Каковы последствия запуска скрипта в качестве демона по сравнению с использованием nohup?

Я знаю, в чем разница с точки зрения процессов разветвления и т. Д., Но какое влияние это оказывает на мой сценарий?

4 ответа

Решение

nohup Команда - это способ, которым бедняк запускает процесс как демон. Как заметил Бруно Рансчарт, когда вы запускаете команду в интерактивной оболочке, она имеет управляющий терминал и будет получать сигнал SIGHUP (зависание), когда завершается управляющий процесс (обычно ваша оболочка входа в систему). nohup Команда организует ввод от /dev/nullи для вывода и ошибок, чтобы перейти к nohup.outи для программы, чтобы игнорировать прерывания, сигналы выхода и зависания. На самом деле он все еще имеет тот же управляющий терминал - он просто игнорирует управление терминалами. Обратите внимание, что если вы хотите, чтобы процесс выполнялся в фоновом режиме, вы должны указать оболочке запустить его в фоновом режиме - по крайней мере, в Solaris (то есть вы вводите 'nohup sleep 20 &"; без амперсанда процесс выполняется синхронно на переднем плане).

Как правило, процесс запускается через nohup это то, что требует времени, но не торчит в ожидании взаимодействия из других источников.

Как правило (что означает, что если вы будете стараться, вы можете найти исключения из этих правил), процесс-демон - это нечто, скрывающееся в фоновом режиме, отключенное от любого терминала, но ожидающее ответа на какой-либо ввод. Сетевые демоны ожидают поступления запросов на соединение или UDP-сообщений по сети, выполняют соответствующую работу и снова отправляют ответ. Например, веб-сервер или СУБД.

Когда процесс полностью демонизирует себя, он проходит через некоторые шаги, которые nohup код проходит; он перестраивает свои входы / выходы так, что он не подключен к какому-либо терминалу, отсоединяется от группы процессов, игнорирует соответствующие сигналы (что может означать, что он не игнорирует никакие сигналы, поскольку нет терминала для отправки ему какого-либо из сгенерированных сигналов через терминал). Как правило, он разветвляется один раз, и родитель успешно завершает работу. Дочерний процесс обычно разветвляется во второй раз, после исправления его группы процессов и идентификатора сеанса и т. Д.; ребенок тоже выходит. Процесс внука теперь автономен и не будет отображаться в ps вывод для терминала, где он был запущен.

Вы можете посмотреть Расширенное программирование в среде Unix, 3-е Эдн от Ричарда Стивенса и Стивена Раго, или на Расширенное программирование Unix, 2-е Эдн от Марка Рочкинда, чтобы обсудить демонизацию.

У меня есть программа daemonize которая демонизирует программу, которая не знает, как демонизировать себя (правильно). Он был написан для обхода дефектов в программе, которая должна была себя демонизировать, но не выполняла эту работу должным образом. Свяжитесь со мной, если хотите - смотрите мой профиль.

Стать демоном

Эта ссылка содержит хороший список шагов, которые должен предпринять процесс, чтобы стать демоном:

https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html

Я не могу скопировать список дословно из-за авторских прав (см. Раздел "О программе"), но вот краткое изложение:

  1. fork (в первый раз) - так что мы не лидер группы, и пусть родительский выход.
  2. вызов setsid() - стать лидером новой сессии. Этот вызов работает, только если мы не являемся лидером группы. Этот новый сеанс не имеет управляющего терминала.
  3. fork (во второй раз) - поэтому мы не являемся лидером сеанса (и поэтому не можем восстановить управляющий терминал), и позволяем родительскому выходу.
  4. cd в корневой каталог - поэтому мы не препятствуем размонтированию других каталогов.
  5. задавать umask желаемое значение (необязательно) - потому что мы могли бы наследовать маску, которую мы не хотели.
  6. закрыть stdin, stdout, stderr (или просто открыть их, чтобы указать в другом месте)

поЬир

Какие nohup делает:

  • Если stdout и stderr подключены к терминалу, перенаправляет их на nohup.out
  • игнорирует SIGHUP

Сходства и различия

Обратите внимание, что единственными общими действиями являются перенаправление stdout и stderr. Чтобы быть демоном, даже не нужно игнорировать SIGHUP.

nohup не требует использования&'для фона процесса - это означает, что вы все еще можете использовать Ctrl-C для отправки SIGINT. Процесс по-прежнему реагирует на ввод с клавиатуры. Он также не меняет стандартный ввод автоматически, поэтому рекомендуется делать это самостоятельно через "< /dev/null".

Пожалуйста, не путайте nohup с другими функциями, обычно используемыми с ним (например, фоновое изображение). ОП спросил конкретно о nohup,

На практике

С практической точки зрения, когда вы хотите запустить одноразовый длительный процесс, который должен продолжаться при выходе из оболочки, вы захотите использовать nohup, но вы также захотите объединить его с фоновым перенаправлением и перенаправлением стандартного ввода. Одноразовое задание не стоит создавать демон, но некоторые свойства демона все еще могут быть полезны для задания nohup, например:cd /".

Периодические задачи по регулярному расписанию лучше всего выполнять через cron (или какой-то другой планировщик).

Демоны лучше всего подходят для наблюдения за повторяющимися задачами, которые не имеют предсказуемого времени начала. Обычно нет определенного конечного времени для процесса-демона (он явно останавливается пользователем / другим процессом или выключением системы). Часто демоны - это сервисы, которые отвечают на приложения (клиенты) или другие условия (например, входящие данные через устройство ввода-вывода через unix select()). Другие демоны опрашивают условие и выполняют ответное действие.

Приложение об управлении терминалом

Смотрите эту страницу. Вкратце: управляющий терминал предоставляет неограниченный доступ к своим стандартным, стандартным, стандартным, стандартным входам. Только одна группа процессов может иметь доступ к стандартному вводу данных. По умолчанию группы фоновых процессов также могут записывать в stdout и stderr.

Кроме того, кажется, что сигналы клавиатуры, отправляемые на терминал, отправляются только группе процессов, которая имеет его в качестве управляющего терминала.

В вариантах UNIX процесс связан с терминальным процессом (оболочкой входа в систему). Поэтому, когда завершается терминальный процесс, процесс также останавливается из-за этой ассоциации. Nohup предотвращает выход процесса при остановке терминала.

Демон или демон - это процесс, который запускается системой при запуске, он работает до завершения работы, никто не просил об этом явно. Таким образом, по определению, это не часть взаимодействия с пользователем, а относится к системе.

Если у вас есть доступ к системе как пользователь, вы можете использовать nohup. Если вы системный администратор, вы можете установить процесс deamon. Для процесса это не имеет значения.

Демон не может быть инициирован, в то время как nohup инициируется пользователем.

Другие вопросы по тегам