Linux демонизируется - PullRequest
       5

Linux демонизируется

45 голосов
/ 22 июня 2010

Я пишу демон Linux.Я нашел два способа сделать это.

  1. Демонизировать ваш процесс, вызвав fork() и установив sid.
  2. Запуск вашей программы с &.

Какой правильный способ сделать это?

Ответы [ 6 ]

77 голосов
/ 22 июня 2010

С http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

Вот шаги, чтобы стать демоном:

  1. fork (), чтобы родитель мог выйти, это возвращает управление в командную строкуили оболочка, вызывающая вашу программу.Этот шаг необходим для того, чтобы новый процесс гарантированно не был лидером группы процессов.Следующий шаг, setsid (), завершается неудачей, если вы являетесь лидером группы процессов.
  2. setsid () становиться группой процессов и лидером группы сеансов.Поскольку управляющий терминал связан с сеансом, а этот новый сеанс еще не приобрел управляющий терминал, наш процесс теперь не имеет управляющего терминала, что является хорошей вещью для демонов.
  3. fork () снова, так что родитель(руководитель группы сеансов) может выйти.Это означает, что мы, как лидер группы, не входящей в сессию, никогда не сможем восстановить управляющий терминал.
  4. chdir ("/"), чтобы гарантировать, что наш процесс не поддерживает использование какого-либо каталога.Невыполнение этого требования может привести к тому, что администратор не сможет размонтировать файловую систему, потому что это был наш текущий каталог.[Эквивалентно, мы могли бы перейти в любой каталог, содержащий файлы, важные для работы демона.]
  5. umask (0), чтобы мы могли полностью контролировать разрешения всего, что мы пишем.Мы не знаем, какой умаск мы могли унаследовать.[Этот шаг является необязательным]
  6. close () fds 0, 1 и 2. Это освобождает стандарт in, out и ошибку, которую мы унаследовали от нашего родительского процесса.У нас нет возможности узнать, куда могли быть перенаправлены эти файлы.Обратите внимание, что многие демоны используют sysconf () для определения предела _SC_OPEN_MAX._SC_OPEN_MAX сообщает вам максимальное количество открытых файлов / процесс.Затем в цикле демон может закрыть все возможные файловые дескрипторы.Вы должны решить, нужно ли вам это делать или нет.Если вы считаете, что могут быть открыты дескрипторы файлов, вам следует закрыть их, поскольку существует ограничение на число одновременных дескрипторов файлов.
  7. Установите новые открытые дескрипторы для stdin, stdout и stderr.Даже если вы не планируете их использовать, все равно стоит открыть их.Точное обращение с ними - дело вкуса;например, если у вас есть файл журнала, вы можете открыть его как stdout или stderr и открыть '/ dev / null' как stdin;в качестве альтернативы, вы можете открыть «/ dev / console» как stderr и / или stdout, а «/ dev / null» - как stdin, или любую другую комбинацию, которая имеет смысл для вашего конкретного демона.1023 * Еще лучше, просто вызовите функцию daemon () , если она доступна.
29 голосов
/ 23 июня 2010

Я предлагаю вообще не писать вашу программу в качестве демона.Сделайте так, чтобы он выполнялся на переднем плане с дескрипторами файлов, текущей директорией, группой процессов и т. Д., Которые ему даны.

Если вы хотите затем запустить эту программу как демон, используйте start-stop-daemon (8), init (8), runv (из runit), upstart, systemd или любой другой, чтобы запустить ваш процесс в качестве демона.То есть, пусть ваш пользователь решает, как запустить вашу программу, и не заставляйте ее запускаться как демон.

12 голосов
/ 22 июня 2010

Просто используйте daemon(3) (из unistd.h).

Функция daemon () предназначена для программ. желающих оторваться от управляющий терминал и запустить в фон как системные демоны. ...

5 голосов
/ 22 июня 2010

Первый.Второе не демонизирует, а работает на заднем плане.Демонизированные программы должны находиться в собственной сессии и группе процессов, и не должен иметь управляющий терминал.

2 голосов
/ 22 июня 2010

Какой язык вы используете? В некоторых языках есть вспомогательные методы, которые облегчают демонизацию. Например, в Ruby есть пакет daemons .

1 голос
/ 22 июня 2010

На самом деле, чтобы сделать демона, нужно сделать двойную вилку.

Запуск программы с помощью & заставляет оболочку запускать программу в фоновом режиме, что не делает ее демоном. У демонов есть init (pid 1) в качестве родителя, поэтому необходима двойная вилка.

Итак, хороший способ сделать что-то, если ваша программа является демоном, - это позаботиться об этой проблеме самостоятельно (есть и другие методы, см. здесь ) Вы также можете использовать программу start-stop-daemon.

...