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

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

Но демонов не так-то просто понять. Согласно параграфу «Обоснование» PEP 3143 , демона, ведущего себя хорошо, должен сделать следующее.

  • Закройте все дескрипторы открытых файлов.
  • Измените текущий рабочий каталог.
  • Сбросьте маску создания доступа к файлу.
  • Выполнить в фоновом режиме.
  • Отсоедините от группы процессов.
  • Игнорировать сигналы ввода-вывода терминала.
  • Отсоедините от управляющего терминала.
  • Не извлекайте контрольный терминал.
  • Правильно справитесь со следующими обстоятельствами:
    • Начат процесс инициализации System V.
    • Завершение демона по сигналу SIGTERM.
    • Дети генерируют сигнал SIGCLD.

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

One Solution collect form web for “Правильное поведение демона (из PEP 3143) объяснено”

PEP 3142 принял эти требования от Unix Network Programming («UNP») к концу W. Richard Stevens. Объяснение ниже цитируется или обобщается из этой книги. Его не так легко найти в Интернете, и он может быть незаконным для загрузки. Поэтому я взял его из библиотеки. Страницы, упомянутые во втором издании, том 1 (1998). (ППС относится к первому изданию, 1990 год.)

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

«Мы закрываем любые открытые дескрипторы, унаследованные от процесса, который выполнял демон (т. Е. Оболочку). [..] Некоторые демоны открывают /dev/null для чтения и записи и дублируют дескриптор на стандартный ввод, стандартный вывод и стандартную ошибку».

(Этот демон «Howdy World» Python демонстрирует это.)

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

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

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

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

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

«Так что, если демон создает свои собственные файлы, биты разрешения в маске создания наследуемого файла не влияют на биты разрешений новых файлов». (UNP, стр. 337)

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

«демон – это процесс, который работает в фоновом режиме и не зависит от управления всеми терминалами». (UNP с 331)

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

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

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

Зачем отсоединяться от группы процессов

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

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

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

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

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

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

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

  • Начало процесса инициализации системы V

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

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

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

В заключение, когда я начал находить ответы на свой вопрос в UNP, мне скоро показалось, что я действительно должен прочитать больше об этом. Это 900 + (!) Страниц, с 1998 года (!), Но я считаю, что концепции и объяснения в UNP выдерживают испытание временем, славно. Стивенс не только прекрасно знал, о чем он говорил, но и понимал, что с этим сложно, и облегчил понимание. Это очень редко.

  • scp с помощью paramiko не работает - ssh отлично работает
  • Изменить путь Python только для Python3
  • Отсутствует GOMP_parallel или GOMP_4.0 в (Docker) jupyter / all-spark-notebook: как R, так и Python
  • Как упаковать файлы python, которые я использую, чтобы я мог распространять их с моим приложением и иметь как можно меньше зависимостей
  • Использование памяти многопроцессорной обработки Python
  • SocketServer.ThreadingTCPServer - не удается привязать адрес после перезагрузки программы
  • Как получить текущий идентификатор процесса Linux из командной строки a в shell-агностике, язык-агностик
  • Простая проблема развертывания Python - целый мир боли
  • Python - лучший язык программирования в мире.