2016-07-20 33 views
0

Ich versuche, einen Daemon-Prozess mit Python-Daemon-Bibliothek ausführen. Ich benutze auch twisted für die Vernetzung.So führen Sie Python-Daemon mit verdrehten

Der Server ist ziemlich einfach:

class Echoer(pb.Root): 
    def remote_echo(self, st): 
     print 'echoing:', st 
     return st 

if __name__ == '__main__': 
    serverfactory = pb.PBServerFactory(Echoer()) 
    reactor.listenTCP(8789, serverfactory) 
    reactor.run() 

Und der Kunde das auch folgt sollte der Dämon-Prozess sein, wie:

class App(): 
    def __init__(self): 
     self.stdin_path = '/dev/null' 
     self.stdout_path = '/dev/tty' 
     self.stderr_path = '/dev/null' 
     self.pidfile_path = '/tmp/foo.pid' 
     self.pidfile_timeout = 5 

    def run(self): 
     clientfactory = pb.PBClientFactory() 
     reactor.connectTCP("localhost", 8789, clientfactory) 
     d = clientfactory.getRootObject() 
     d.addCallback(self.send_msg) 
     reactor.run() 

    def send_msg(self, result): 
     d = result.callRemote("echo", "hello network") 
     d.addCallback(self.get_msg) 

    def get_msg(self, result): 
     print "server echoed: ", result 

app = App() 
daemon_runner = runner.DaemonRunner(app) 
daemon_runner.do_action() 

Wenn ich den Client als python test.py start der Daemon-Prozess ausgeführt wird gestartet, aber irgendwie ist die Verbindung nicht hergestellt.

Aber wenn ich die letzten Zeilen in dem Client wie unten geändert:

app = App() 
app.run() 

Dann wird die Verbindung korrekt hergestellt würde und arbeiten. Aber in diesem Fall ist es kein Daemon-Prozess mehr.

Was fehlt mir hier? Wie kann ich es erreichen?

Antwort

1

Twisted verfügt bereits über integrierte Daemonisierungsfunktionen, sodass Sie keine python-daemon hinzufügen müssen. Es kann einige lustige Verhaltensüberschneidungen zwischen den beiden geben, die dich beißen könnten. Wie Sie gesehen haben, ist es, sobald Sie Ihre Anwendung bekommen haben, ziemlich einfach im Vordergrund zu laufen, wie Sie es oben getan haben. Es ist auch ziemlich einfach, es als Daemon auszuführen; siehe twistd description und twistd man page für weitere Informationen über twistd, aber im Grunde werden Sie nur ein paar Zeilen von Boilerplate hinzufügen und führen Sie Ihren Server durch twistd.

Siehe den Artikel Running a Twisted Perspective Broker example with twistd für eine Schritt-für-Schritt-Anleitung, wie es geht.