Linux daemonize

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

  1. Daemonize Ваш процесс путем вызова fork() и установка sid.
  2. Запущение программы с &.

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

46
задан frogatto 12 September 2017 в 05:26
поделиться

6 ответов

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

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

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

Еще лучше, просто вызовите функцию daemon () , если она доступна.

78
ответ дан 26 November 2019 в 20:09
поделиться

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

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

12
ответ дан 26 November 2019 в 20:09
поделиться

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

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

29
ответ дан 26 November 2019 в 20:09
поделиться

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

5
ответ дан 26 November 2019 в 20:09
поделиться

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

2
ответ дан 26 November 2019 в 20:09
поделиться

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

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

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

1
ответ дан 26 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: