Някаква причина, поради която 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()

В shell (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