Любая причина, по которой pid не создается и процесс не запускается?

Я пытаюсь использовать python-daemon с этим скриптом, чтобы запускать и останавливать выполнение некоторого кода в фоновом режиме. (конечная цель — иметь это в экземпляре AWS).

По какой-то причине, которая ускользает от меня, файл pid не создается, и я думаю, что процесс не запущен.

Скрипт Python:

#standard python libs
import logging
import time

#third party libs
from daemon import runner

class App():

    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path = '/Users/NAME/Documents/workspace/RandomThings/testdaemon.pid'
        self.pidfile_timeout = 5

    def run(self):
        while True:
            #Note that logger level needs to be set to logging.DEBUG before this shows up in the logs
            logger.debug("Debug message")
            logger.info("Info message")
            logger.warn("Warning message")
            logger.error("Error message")
            #Main code goes here ...
            sst=myClass()
            sst.run()
            time.sleep(10)

app = App()
logger = logging.getLogger("DaemonLog")
logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler = logging.FileHandler("/Users/NAME/Documents/workspace/RandomThings/testdaemon.log")
handler.setFormatter(formatter)
logger.addHandler(handler)

daemon_runner = runner.DaemonRunner(app)
#This ensures that the logger file handle does not get closed during daemonization
daemon_runner.daemon_context.files_preserve=[handler.stream]
daemon_runner.do_action()

В оболочке (OSX) я делаю:

python daemon.py start >>>> это запускается, но файл pid не создается (также пробовал sudo) python daemon.py stop >>>> возвращает ошибку:

Трассировка (последний последний вызов): файл «SST_daemon.py», строка 68, в файле daemon_runner.do_action() «/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/daemon /runner.py", строка 189, в файле do_action func(self) "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/daemon/runner.py", строка 152, in _stop u"PID-файл%(pidfile_path)r не заблокирован" % vars()) daemon.runner.DaemonRunnerStopFailureError: PID-файл "/Users/josefernandes/Documents/workspace/RandomThings/testdaemon.pid" не заблокирован

Я пытался исправить это в течение нескольких часов, но пока безрезультатно.

Любая причина, почему это не работает?

Любая помощь очень ценится!!!!!


person jpsfer    schedule 09.04.2014    source источник


Ответы (1)


Не уверен, почему это не сработало для вас, но, возможно, приведенный ниже код может прояснить некоторые вещи. Мне пришлось импровизировать, так как у меня не было упомянутого вами myClass. В моем классе Spam есть метод run(), который зацикливается: а ваш? Если вы это сделаете, вы можете быть удивлены тем, что ваш цикл в App.run() не зацикливается, поскольку он остается в myClass. Но это в стороне.

Мне пришлось внести некоторые изменения в путь, так как у меня нет OSX. Но я старался больше ничего не менять, и у меня работает код ниже:

  1 #standard python libs
  2 import logging
  3 import time
  4 
  5 #third party libs
  6 from daemon import runner
  7 import spam.eggs
  8 
  9 class App():
 10 
 11     def __init__(self):
 12         self.stdin_path = '/dev/null'
 13         self.stdout_path = '/dev/tty'
 14         self.stderr_path = '/dev/tty'
 15         self.pidfile_path = '/home/fbicknel/tmp/testdaemon.pid'
 16         self.pidfile_timeout = 5
 17 
 18     def run(self):
 19         while True:
 20             #Note that logger level needs to be set to logging.DEBUG before this shows up in the logs
 21             logger.debug("Debug message")
 22             logger.info("Info message")
 23             logger.warn("Warning message")
 24             logger.error("Error message")
 25             #Main code goes here ...
 26             # sst=myClass()
 27             # sst.run()
 28             sst=spam.eggs.Eggs()
 29             sst.run()
 30             time.sleep(10)
 31 
 32 app = App()
 33 logger = logging.getLogger("DaemonLog")
 34 logger.setLevel(logging.INFO)
 35 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
 36 handler = logging.FileHandler("/home/fbicknel/tmp/testdaemon.log")
 37 handler.setFormatter(formatter)
 38 logger.addHandler(handler)
 39 
 40 daemon_runner = runner.DaemonRunner(app)
 41 #This ensures that the logger file handle does not get closed during daemonization
 42 daemon_runner.daemon_context.files_preserve=[handler.stream]
 43 daemon_runner.do_action()

Одна вещь, которую я попытался начать, заключалась в том, чтобы полностью исключить myClass и просто позволить вашему циклу в run() выполнять цикл. Это сработало, поэтому я добавил в spam.Eggs.

Надеюсь, это заставит вас идти снова.

Ниже мой модуль в spam/eggs.py:

  1 import time
  2 import logging
  3 
  4 class Eggs(object):
  5     def __init__(self, startvalue='green'):
  6         " init a spam object "
  7         self.logger = logging.getLogger("DaemonLog")
  8         self.color  = startvalue
  9 
 10     @property
 11     def color(self):
 12         return self._color
 13         
 14     @color.setter
 15     def color(self, value): 
 16         self._color = value
 17     
 18     def run(self):
 19         ' Just loop sounding happy. '
 20         while True:
 21             self.logger.info("yippie kai ai o")
 22             time.sleep(20)
 23             
 24 if __name__ == "__main__":
 25     spamalot = Eggs()
 26     print spamalot.color
 27     spamalot.color = 42
 28     print spamalot.color
person fbicknel    schedule 06.05.2014
comment
Спасибо за это. Прохожу через это сейчас ... Я только что попробовал аналогичный демон с классом типа «Hello World», и это сработало, но этот продолжает ускользать от меня. Я обеспокоен тем, что это может быть проблемой numpy.... - person jpsfer; 07.05.2014
comment
Привет. Это не сработало, потому что я использую функцию в numpy (SVD), которая, по-видимому, дает сбой при помещении в отдельный процесс/рабочий процесс. В итоге я перенес проект на Linux-машину в AWS, и там не было проблем. - person jpsfer; 01.06.2014