2009-07-07 5 views
5

Ich habe ein einfaches web.py-Programm, um Daten zu laden. Auf dem Server möchte ich keinen Apache oder irgendeinen Webserver installieren.Führen Sie web.py als Daemon

ich versuche, es als Hintergrunddienst zu setzen mit http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

Und Subklassifizieren: (von http://www.jejik.com/files/examples/daemon.py)

class Daemon: 
    def start(self): 
     """ 
     Start the daemon 
     """ 
     ... PID CHECKS.... 

     # Start the daemon 
     self.daemonize() 
     self.run() 
#My code 
class WebService(Daemon): 
     def run(self): 
      app.run() 

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       service.start() 
      elif 'stop' == sys.argv[1]: 
       service.stop() 
      elif 'restart' == sys.argv[1]: 
       service.restart() 
      else: 
       print "Unknown command" 
       sys.exit(2) 
      sys.exit(0) 
     else: 
      print "usage: %s start|stop|restart" % sys.argv[0] 
      sys.exit(2) 

jedoch die web.py Software lädt nicht (dh: Der Dienst nicht hören)

Wenn ich es direkt anrufe (dh: Keine Verwendung des Daemon-Codes), funktioniert es gut.

Antwort

5

Ich finde endlich das Problem.

web.py von Befehlszeile akzeptiert die optionale Portnummer:

python code.py 80 

Und das Skript auch eine Eingabe von der Kommandozeile übernehmen:

python WebServer start 

dann web.py versuchen zu verwenden, "Start" als Portnummer und fehlgeschlagen. Ich sehe den Fehler nicht, weil er im Hintergrund war.

ich dieses Problem beheben mit einem Mini-Hack:

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       sys.argv[1] = '8080' 
       service.start() 
0

Ich glaube nicht, dass Sie dem Dämon sagen, dass er ausgeführt werden soll. Sie müssen ein MyDaemon-Objekt instanziieren und o.run() aufrufen. Offenbar startet und stoppt WebService nur die Service-Schnittstelle zu Ihrer Web-App, nicht die eigentliche Web-App selbst.

+0

ich die Frage aktualisieren, um anzuzeigen, dass bei Aufruf „Start“ wird der „run“ -Methode aufgerufen. – mamcx

+0

Ich kann immer noch nicht sagen, wie der Dienst (von WebService) eine Verbindung zu MyDaemon herstellt, es sei denn, er ist implizit. – mcandre

+0

Oh, mein Fehler :(. Ich vergesse, den richtigen Klassennamen (schlechte Kittie kopieren/einfügen!) – mamcx

4

Sie die web.py mit diesem Befehl starten

/usr/bin/python index.py > log.txt 2>&1 & 
0

Anstatt das zweite Argument überschreiben, wie Sie hier schrieb:

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       sys.argv[1] = '8080' 
       service.start() 

Sie könnten einfach das zweite Argument auf "Start | Neustart", wie folgt löschen:

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       delete del sys.argv[1:2] 
       service.start() 

Auf diese Weise erhält der Webpy alle Argumente, die Sie von der Befehlszeile mit Ausnahme des Daemon-Controllers übergeben haben. Dann können Sie laufen einfach:

python WebServer start 8080