Стать демоном
Эта ссылка содержит хороший список шагов, которые процесс должен предпринять, чтобы стать демоном:
https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Я не могу скопировать список дословно из-за авторских прав (см. Раздел «О программе»), но вот краткое изложение:
fork
(в первый раз) - так что мы не лидер группы, и пусть родительский выход.
- вызов
setsid()
- стать лидером нового сеанса. Этот вызов работает, только если мы не являемся лидером группы. Этот новый сеанс не имеет управляющего терминала.
fork
(второй раз) - поэтому мы не являемся лидером сеанса (и поэтому не можем восстановить управляющий терминал), и позволяем родительскому выходу.
cd
в корневой каталог - поэтому мы не запрещаем размонтировать другие каталоги.
- установите
umask
на желаемое значение (необязательно) - потому что мы могли бы унаследовать маску, которая нам не нужна.
- закрыть 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.
Кроме того, похоже, что сигналы клавиатуры, отправляемые на терминал, отправляются только в группу процессов, которая имеет его в качестве управляющего терминала.