2012-12-05 13 views
9

Ich habe kleine Web-Server mit Werkzeug erstellt und ich kann es in der üblichen Python-Art mit python my_server.py ausführen. Seiten laden, alles funktioniert gut. Jetzt möchte ich es starten, wenn mein PC bootet. Was ist der einfachste Weg das zu tun? Ich habe mit Emporkömmling kämpfen, aber es scheint nicht zu „in einem Hintergrund zu leben“ Cuz, nachdem ich start my_server sofort ausführen ich kernel: [ 8799.793942] init: my_server main process (7274) terminated with status 1Run Python-Skript als Daemon beim Booten (Ubuntu)

my_server.py erhalten:

... 
if __name__ == '__main__': 
    from werkzeug.serving import run_simple 
    app = create_app() 
    run_simple('0.0.0.0', 4000, app) 

Emporkömmling Konfigurationsdatei my_server.conf :

description "My service" 
author "Some Dude <[email protected]>" 
start on runlevel [2345] 
stop on runlevel [016] 
exec /path/to/my_server.py 
start on startup 

Irgendwelche Ideen, wie man es arbeiten lässt? Oder eine andere bessere Möglichkeit, das Skript zu dämonisieren?

Update: Ich glaube, das Problem liegt innerhalb my_server.py. Es scheint nicht den Webserver (Methode run_simple()) an erster Stelle zu initiieren. Welche Schritte sollten unternommen werden, um die .py-Datei von einem Task-Handler wie dem Upstart auszuführen?

  • Platz shebang als erste Zeile #!/usr/bin/env python
  • Ausführung ermöglichen Berechtigungen chmod 755
  • Starten Sie den Daemon mit Superuser-Rechte (absolut sicher sein, keine Berechtigungseinschränkungen es von Start verhindert)
  • Stellen alle Python-Bibliotheken sicher sind, Dort!
  • Etwas anderes?

Gelöst: Das Problem war, mit Python Abhängigkeiten fehlen. Beim Starten des Skripts über den Task-Manager (z. B. upstart oder start-stop-daemon) werden keine Fehler ausgelöst. Sie müssen absolut sicher sein, dass pythonpath alles enthält, was Sie brauchen.

+0

Versuchen Sie runlevels 235 und bilden Sie den Benutzer, den Sie Server ausführen Sie verwenden 4000 priviligierte Ports, die Admin-Rechte erfordert. – Denis

+0

Ich führe es als Superuser und ändern Runlevel zu 235 hat nicht geholfen. – and3p

+0

Ist es möglich, dass die Abhängigkeitsdienste Ihrer App noch nicht gestartet sind? Wie eine Datenbank? – tdihp

Antwort

11

Eine einfache Möglichkeit, crontab zu tun ist, mit:

$ crontab -e 

Eine crontab-Datei zur Bearbeitung erscheint, schreiben Sie die Zeile am Ende:

@reboot python myserver.py 

und beenden. Jetzt, nach jedem Neustart, wird der Cron-Daemon Ihr myserver-Python-Skript ausführen.

+3

Ihr Vorschlag könnte funktionieren, aber ich möchte den Daemon starten/stoppen/neustarten, anstatt das ganze System im Falle eines Absturzes neu zu starten. – and3p

+1

Sie können http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ überprüfen, wenn Sie daran interessiert sind, Ihren Code zu einem echten Daemon zu machen (ich dachte, es wäre bereits geschehen, und Sie mussten ihn nur starten) zur Bootzeit) – kaspersky

17

Neben gg.kaspersky Methode können Sie auch das Skript in einen „Dienst“ drehen, so dass Sie beginnen können, oder es nicht mehr verwenden:

$ sudo service myserver start 
* Starting system myserver.py Daemon       [ OK ] 
$ sudo service myserver status 
* /path/to/myserver.py is running 
$ sudo service myserver stop 
* Stopping system myserver.py Daemon       [ OK ] 

und definieren es als Start-up-Dienst:

$ sudo update-rc.d myserver defaults 

Dazu müssen Sie diese Datei erstellen und in /etc/init.d/ speichern.

#!/bin/sh -e 

DAEMON="/path/to/myserver.py" 
DAEMONUSER="myuser" 
DAEMON_NAME="myserver.py" 

PATH="/sbin:/bin:/usr/sbin:/usr/bin" 

test -x $DAEMON || exit 0 

. /lib/lsb/init-functions 

d_start() { 
     log_daemon_msg "Starting system $DAEMON_NAME Daemon" 
     start-stop-daemon --background --name $DAEMON_NAME --start --user $DAEMONUSER --exec $DAEMON 
     log_end_msg $? 
} 

d_stop() { 
     log_daemon_msg "Stopping system $DAEMON_NAME Daemon" 
     start-stop-daemon --name $DAEMON_NAME --stop --retry 5 --name $DAEMON_NAME 
      log_end_msg $? 
} 

case "$1" in 

     start|stop) 
       d_${1} 
       ;; 

     restart|reload|force-reload) 
         d_stop 
         d_start 
       ;; 

     force-stop) 
       d_stop 
       killall -q $DAEMON_NAME || true 
       sleep 2 
       killall -q -9 $DAEMON_NAME || true 
       ;; 

     status) 
       status_of_proc "$DAEMON_NAME" "$DAEMON" "system-wide $DAEMON_NAME" && exit 0 || exit $? 
       ;; 
     *) 
       echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}" 
       exit 1 
       ;; 
esac 
exit 0 

In diesem Beispiel nehme ich an, Sie shebang wie # haben!/Usr/bin/python an der Spitze Ihrer Python-Datei, so dass Sie es direkt ausführen kann.

Last but not least, vergessen Sie nicht, Ausführungsrechte auf Ihren Python-Server und dem Dienst-Skript zu geben:

$ sudo chmod 755 /etc/init.d/myserver 
$ sudo chmod 755 /path/to/mserver.py 

Hier ist die page, wo ich diese ursprünglich gelernt (französisch).

Prost.

+0

Gute Erklärung auf hove, um einen Deamon zu erstellen, aber wie mein Update suggeriert, glaube ich, dass etwas mit 'script' selbst nicht stimmt. – and3p

+0

@tvuillemin: Diese Methode war nützlich für mich, aber ich muss mein Skript debuggen ... wo finde ich die Standard-und Fehlerausgabe meines Daemon-Skript? – Throoze

4

Wenn Sie supervisor Service haben, der beim Booten beginnt, schreiben Sie einen Supervisor-Service ist viel, viel einfacher.

Sie können sogar Autorestart einstellen, wenn Ihr Programm fehlschlägt.