Я пишу демона Linux. Я нашел два способа сделать это.
- Демонстрируйте свой процесс, позвонив
fork()
и установивsid
. - Запуск вашей программы с помощью
&
.
Каков правильный способ сделать это?
Я пишу демона Linux. Я нашел два способа сделать это.
fork()
и установив sid
.&
.Каков правильный способ сделать это?
От http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Вот шаги, чтобы стать демонами:
- fork(), чтобы родительский элемент мог выйти, он возвращает элемент управления в командную строку или оболочку, вызывающую вашу программу. Этот шаг необходим, чтобы гарантировать, что новый процесс не будет лидером группы процессов. Следующий шаг, setsid(), терпит неудачу, если вы являетесь лидером группы процессов.
- setsid(), чтобы стать группой процессов и лидером группы сеансов. Поскольку управляющий терминал связан с сеансом, и этот новый сеанс еще не приобрел контрольный терминал, наш процесс теперь не имеет управляющего терминала, который является хорошим типом для демонов.
- fork() снова, чтобы родительский (лидер группы сеансов) мог выйти. Это означает, что мы, как лидер несетевой группы, никогда не сможем восстановить контрольный терминал.
- chdir ( "/" ), чтобы гарантировать, что наш процесс не будет использовать какой-либо каталог. Невозможность сделать это может привести к тому, что администратор не сможет отключить файловую систему, потому что это был наш текущий каталог. [Эквивалентно, мы могли бы перейти на любой каталог, содержащий файлы, важные для операции демона.]
- umask (0), чтобы мы имели полный контроль над разрешениями всего, что мы пишем. Мы не знаем, что umask мы могли унаследовать. [Этот шаг не является обязательным]
- close() fds 0, 1 и 2. Это освобождает стандартную входную, выходную и ошибку, которые мы унаследовали от нашего родительского процесса. У нас нет способа узнать, куда эти фоны могли быть перенаправлены. Обратите внимание, что многие демоны используют sysconf() для определения предела _SC_OPEN_MAX. _SC_OPEN_MAX сообщает вам максимальные открытые файлы/процесс. Затем в цикле демон может закрыть все возможные файловые дескрипторы. Вы должны решить, нужно ли вам это делать или нет. Если вы считаете, что файловые дескрипторы могут открываться, вы должны закрыть их, так как существует ограничение на количество одновременных дескрипторов файлов.
- Установите новые открытые дескрипторы для stdin, stdout и stderr. Даже если вы не планируете использовать их, все же рекомендуется открыть их. Точное обращение с ними - дело вкуса; если у вас есть файл журнала, например, вы можете открыть его как stdout или stderr и открыть '/dev/null' как stdin; альтернативно, вы можете открыть '/dev/console' как stderr и/или stdout, а '/dev/null' в качестве stdin или любую другую комбинацию, которая имеет смысл для вашего конкретного демона.
Еще лучше, просто вызовите функцию daemon(), если она доступна.
Я предлагаю не писать вашу программу как демон вообще. Запустите его на переднем плане с файловыми дескрипторами, текущим каталогом, группой процессов и т.д., Как это указано.
Если вы хотите запустить эту программу в качестве демона, используйте start-stop-daemon (8), init (8), runv (из runit), upstart, systemd или что-то другое, чтобы запустить ваш процесс в качестве демона. То есть, пусть ваш пользователь решает, как запустить вашу программу, и не принуждать ее выполнять как демон.
Просто используйте daemon(3)
(от unistd.h
).
Функция daemon() предназначена для программ желая отделиться от управляющий терминал и работать в фон как системные демоны....
Первый. Второе не демонамизирует, а работает на фоне. Демонстрированные программы должны быть в собственной сессии и группе процессов и не должны иметь управляющий терминал.
Собственно, чтобы сделать демона, вам нужно удвоить вилку.
Запуск программы с помощью a и заставить оболочку запускать программу в фоновом режиме, что не делает ее демоном. У демонов есть init (pid 1) в качестве родителя, поэтому нужна двойная вилка.
Таким образом, хороший способ сделать что-то, если ваша программа является демоном, - это позаботиться об этой проблеме самостоятельно (есть еще несколько методов, см. здесь тоже). Вы также можете использовать программу start-stop-daemon.
Какой язык вы используете? На некоторых языках есть вспомогательные методы, которые упрощают демонтаж. Например, Ruby имеет демоны.