Правильное поведение демона (из PEP 3143) объяснено

У меня есть некоторые задачи [для моего RPi] в Python, которые включают в себя много sleeping: сделайте что-то, что занимает секунду или две или три, а затем подождите несколько минут или часов. Я хочу передать управление обратно в ОС (Linux) в это время спать. Для этого я должен daemonise этих задач. Один из способов-использовать стандартную библиотеку процессов демона Python.

но демонов не так легко понять. В соответствии с пунктом обоснования PEP 3143, хорошо воспитанный демон следует сделать следующее.

  • закройте все открытые файловые дескрипторы.
  • изменить текущий рабочий каталог.
  • сброс маски создания доступа к файлам.
  • запуск в фоновом режиме.
  • отделился от группы процессов.
  • игнорировать сигналы ввода/вывода терминала.
  • отделился от терминала управления.
  • не повторно запрашивать терминал управления.
  • правильно обрабатывать следующие обстоятельства:
    • запускается процессом инициализации System V.
    • завершение демона по сигналу SIGTERM.
    • дети генерируют сигнал SIGCLD.

для новичка Linux / Unix, такого как я, некоторые из них вряд ли являются объяснением. Но я хочу знать, почему я делаю то, что делаю. Так в чем же причина такого обоснования?

1 ответов


PEP 3142 взял эти требования из Сетевое Программирование Unix ('UNP') покойного У. Ричарда Стивенса. Приведенное ниже объяснение цитируется или резюмируется из этой книги. Это не так легко найти в интернете, и это может быть незаконно, чтобы загрузить. Поэтому я взял его в библиотеке. Упомянутые страницы содержатся во втором издании, Том 1 (1998 год). (ОПТОСОЗ относится к первому изданию 1990 года.)

закрыть все открытые дескрипторы файлов.

"мы закрываем любые открытые дескрипторы, унаследованные от процесса, который выполнил демон (т. е. оболочку). [.. Некоторые демоны открывают /dev/null для чтения и записи и дублировать дескриптор для стандартного ввода, стандартного вывода и стандартной ошибки."

(это ' Howdy World ' Python daemon демонстрирует это.)

" это гарантирует, что общие дескрипторы открыты, и чтение из любого из этих дескрипторов возвращает 0 (конец Файл), и ядро просто отбрасывает все, что написано в любом из этих трех дескрипторов. Причина открытия этих дескрипторов заключается в том, что любая библиотечная функция, вызываемая демоном, которая предполагает, что она может читать со стандартного ввода или записывать на стандартный вывод или стандартную ошибку, не будет терпеть неудачу. В качестве альтернативы некоторые демоны открывают файл журнала, в который они будут записывать во время работы, и дублируют его дескриптор на стандартный вывод и стандартную ошибку". (UNP p. 337)

изменить текущий рабочий каталог

"демон принтера может перейти в каталог катушек принтера, где он выполняет всю свою работу. [...] Демон мог быть запущен в любом месте файловой системы, и если он остается там, эта файловая система не может быть размонтирована.(UNP p 337)

почему вы хотите размонтировать файловую систему? Две причины:--35--> 1. Вы хотите разделить (и иметь возможность монтировать и размонтировать) каталоги, которые могут заполняться пользовательскими данными из каталогов, посвященных ОС.
2. Если вы запускаете демона, скажем, с USB-накопителя, вы хотите иметь возможность размонтировать этот накопитель, не мешая демону.

сброс маски создания доступа к файлам.

" таким образом, если демон создает свои собственные файлы, биты разрешений в унаследованной маске создания режима файлов не влияют на биты разрешений новых файлов.(UNP, p 337)

выполнить в фон.
По определению

"демон-это процесс, который выполняется в фоновом режиме и не зависит от контроля со всех терминалов". (UNP p 331)

отделился от группы процессов.
Чтобы понять это, вам нужно понять, что такое группа процессов, и это означает, что вам нужно знать, что fork делает.

что вилка делает

fork только (в Unix), чтобы создать новый процесс. (в Linux также есть clone). Ключ к пониманию fork это то, что он возвращает два раза при вызове (один раз): один раз в вызывающем процессе (= parent) с идентификатором процесса вновь созданного процесса (= child) и один раз в дочернем. "Все дескрипторы, известные родителю при разветвлении, делятся с дочерним, когда fork возвращается."(УНП стр. 102). Когда процесс хочет выполнить другую программу, он создает новый процесс, вызывая fork, который создает копию самого себя. Затем один из них (обычно ребенок) вызывает новую программу. (UNP, p 102)

зачем отключаться от группы процессов

дело в том, что руководитель сеанса может приобрести управляющий терминал. Демон никогда не должен этого делать, он должен оставаться в тени. Это достигается путем вызова fork дважды: родительские вилки для создания ребенка, дочерние вилки для создания внука. Родитель и ребенок прекращены, но внук остатки. Но поскольку это внук, это не руководитель сеанса, и поэтому он не может приобрести управляющий терминал. (Summarised from UNP par 12.4 p 335)

двойная вилка обсуждается более подробно здесь, и в комментариях ниже.

игнорировать сигналы ввода/вывода терминала.

"сигналы, генерируемые терминальными ключами, не должны влиять на демонов, запущенных с этого терминала ранее". (UNP p. 331)

отделился от терминала управления и не вернуть терминал управления.
К настоящему времени причины очевидны:

" если демон запускается с терминала, мы хотим иметь возможность использовать этот терминал для других задач позже. Например, если мы запускаем демона из терминала, выходим из терминала, и кто-то другой входит в этот терминал, мы не хотим, чтобы сообщения об ошибках демона появлялись во время следующего сеанс терминала пользователя."(UNP p 331)

правильно обрабатывать следующие обстоятельства:

  • запускается системой V init process

    • демон должен запускаться во время загрузки, очевидно.
  • завершение демона по сигналу SIGTERM

    • SIGTERM означает прекращение сигнала. По завершении работы, процесс init обычно отправляет SIGTERM всем процессам, обычно ждет от 5 до 20 секунд, чтобы дать им время для очистки и завершения. Кроме того, ребенок может отправить SIGTERM своему родителю, когда его родитель должен прекратить делать то, что он делает. (UNP p 408)
  • дети генерируют сигнал SIGCLD

    • Стивенс обсуждает SIGCHLD, а не SIGCLD. Разница между ними не важна для понимания демона поведение. Если ребенок завершается, он отправляет sigchld своему родителю. Если родитель не поймает его, ребенок станет зомби (UNP p 118). О, как весело.