python-daemon: как позвонить в ipython?

У меня есть скрипт, который реализует простой процесс демона с использованием python-daemon, функция которого заключается в чтении пакетов данных из сокета и записи этих данных в файл. Давайте вызовем этот сценарий read_socket.py, который принимает строку IP-адреса в качестве аргумента и содержит определение класса для демона (для краткости я не включил код, так как это не та проблема, где я лежу, но я счастлив так, если это полезно). Мотивация использования процесса-демона состоит в том, что у меня будет несколько экземпляров одного и того же скрипта, который будет следить за разными сокетами, работающими одновременно (т.е. передавать разные IP-адреса при создании экземпляра класса). У меня есть сценарий, работающий как положено, и использующий типичный if __name__ == "__main__:" Конструкция может запустить его из командной строки как "python read_socket.py IPADD".

Я нахожусь в точке, где я начинаю писать сценарий управления на Python, чтобы порождать несколько экземпляров этого демона программно, и в идеале я хотел бы иметь возможность взаимодействовать с процессами (через запрограммированную обработку сигналов.. и т. д.) в iPython.

Я думаю, что мне хотелось бы иметь объект, который я могу создать как обычно, который будет содержать атрибуты, относящиеся к процессу демона (pid, pidfile..etc) и методы для передачи сигналов процессу. После этого я бы вызвал стандартный метод запуска демонизации, который затем демонизировал бы процесс, и вернулся бы к интерпретатору iPython. Пример типа псевдокода может быть:

In [1]: import read_socket
In [2]: daemonhandler = read_socket.DaemonClass("1.2.3.4") 
In [3]: daemonhandler.pidfile
Out[3]: <TimeoutPIDLockFile: '/var/run/mydaemon.pid' -- '/var/run/mydaemon.pid'>   

In [4]: daemonhander.daemonise()
Out[4]: "Process created with PID 12345"
In [5]: <ready for more commands>

До сих пор мои усилия не увенчались успехом в последней части - терминал вернулся к обычному (в моем случае, bash) интерпретатору оболочки. Посмотрев в код daemon.py, кажется, есть код (см. Ниже, строка 697), который выходит из родительского процесса. Я не совсем уверен, если это необходимо, но комментирование этого не решает мою проблему.

try:
    pid = os.fork()
    if pid > 0:
        os._exit(0)

Я попытался запустить метод демонизации в отдельном потоке, который все еще выходит из iPython. Я также пробовал multiprocessing.Process, но получаю ошибку в модуле python-daemon, связанную с закрытием stdin (кроме того, я не думаю, что это правильный способ достичь того, что я хочу, как запуск процесса для запуска процесс кажется неуклюжим и не элегантным). Я могу предоставить фрагменты кода, если это представляет интерес.

Итак, мои вопросы таковы:

  • Должен ли демонизирующий процесс обязательно выходить из контролирующего / родительского процесса?
  • Возможно ли то, что я описал, и возможно ли это? И если да, то где мне нужно внести изменения?
  • Или, в более общем смысле, я думаю об этом неправильно, и существует ли "лучший" / более общепринятый способ реализации чего-то подобного?

Спасибо за ваше время.

0 ответов

Другие вопросы по тегам