Демонизирующий проект Python, который использует Twisted - PullRequest
4 голосов
/ 20 октября 2011

Если мы используем PEP-3143 и его эталонную реализацию http://pypi.python.org/pypi/python-daemon тогда кажется, что Twisted не может работать, поскольку во время демонизации ВСЕ возможные обработчики файлов явно закрываются, включая каналы.

Когда Twisted пытается вызвать os.pipe(), а затем записать в него - получает неверный дескриптор файла.

На мой взгляд, демон PEP не подходит для сетевого взаимодействия этого PEP? И, вероятно, это причина того, что витые существуют

Edit:
Я должен указать, что вопрос скорее в том, «почему PEP фактически делает невозможным создание сетевого приложения», чем в том, «Как это сделать». Twisted нарушает эти правила для того, чтобы работать

Ответы [ 4 ]

2 голосов
/ 20 октября 2011

Он не закрывает все дескрипторы открытого файла: только те, которые отсутствуют в атрибуте files_preserve. Возможно, вы могли бы заставить это работать, выяснив FD стакана и всех открытых розеток в реакторе, а затем передав его на files_preserve ... но зачем? Просто используйте twistd и закрутите демон.

Еще лучше, используйте twistd -n, и пусть ваш процесс контролируется каким-либо другим системным инструментом, и вообще не беспокойтесь о демонизации.

1 голос
/ 20 октября 2011

Не стесняйтесь использовать этого демона http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

Как его смешать с витой см. Здесь

http://michael -xiii.blogspot.com / 2011/10 / twisted.html (предупреждение! Русский текст впереди, но код Python довольно показательный)

1 голос
/ 20 октября 2011

supervisord + upstart

0 голосов
/ 21 октября 2011

Практика закрытия всех открытых файловых дескрипторов является следствием возможности того, что процесс деамонизации наследует некоторые открытые файлы от родительского процесса.Например, вы можете открыть десятки файлов в одном процессе (скажем, с помощью os.open()) или затем вызвать подпроцесс, который их наследует.Вероятно, у вас, как подпроцесса, нет простого способа узнать, какие файловые дескрипторы полезны из родительского процесса (если вы не передаете это вместе с аргументами командной строки), и вам определенно не нужны stdin, stdout или stderr, поэтомуСовершенно разумно, прежде чем что-либо делать, закрыть все открытые файлы.

Затем процесс деамонизации предпримет некоторые дополнительные шаги, чтобы стать демоном (как изложено в PEP).

Один разпроцесс полностью отсоединен от любого терминала, он может запускать , открывая файлы и соединения по мере необходимости.Он откроет свои файлы журналов, свои файлы конфигурации и свои сетевые подключения.

Другие упоминали, что с помощью инструмента twistd все это довольно круто, и вы неТ нужно использовать дополнительный модуль.Если вы не хотите использовать twistd (по какой-то причине), но хотите использовать twisted, вы можете использовать что-то внешнее, но сначала вы должны деамонизировать , а затем импортировать twisted и остальные вашиКод приложения и открытые сетевые подключения последними.

...