Ich skizziere die Architektur für eine Reihe von Programmen, die verschiedene miteinander verbundene Objekte gemeinsam nutzen, die in einer Datenbank gespeichert sind. Ich möchte, dass eines der Programme als Dienst fungiert, der eine übergeordnete Schnittstelle für Operationen an diesen Objekten bietet, und dass die anderen Programme über diesen Dienst auf die Objekte zugreifen.
Ich strebe derzeit Python und das Django-Framework als Technologien für die Implementierung dieses Dienstes an. Ich bin mir ziemlich sicher, wie ich das Python-Programm unter Linux dämonisieren kann. Es ist jedoch ein optionales Spezifikationselement, dass das System Windows unterstützen soll. Ich habe wenig Erfahrung mit Windows-Programmierung und überhaupt keine Erfahrung mit Windows-Diensten.
Ist es möglich, Python-Programme als Windows-Dienst auszuführen (dh automatisch ohne Benutzeranmeldung auszuführen)? Ich muss diesen Teil nicht unbedingt implementieren, aber ich brauche eine grobe Vorstellung davon, wie es gemacht werden würde, um zu entscheiden, ob ich in diese Richtung entwerfen soll.
Edit: Danke für alle Antworten bisher, sie sind ziemlich umfassend. Ich möchte noch eines wissen: Wie ist Windows auf meinen Dienst aufmerksam? Kann ich es mit den nativen Windows-Dienstprogrammen verwalten? Was entspricht dem Einfügen eines Start / Stopp-Skripts in /etc/init.d?
quelle
Antworten:
Ja, du kannst. Ich mache es mit den Pythoncom-Bibliotheken, die in ActivePython enthalten sind oder mit pywin32 (Python für Windows-Erweiterungen) installiert werden können .
Dies ist ein Grundgerüst für einen einfachen Service:
Ihr Code wird in die
main()
Methode aufgenommen - normalerweise mit einer Endlosschleife, die möglicherweise durch Überprüfen eines Flags unterbrochen wird, das Sie in derSvcStop
Methode gesetzt habenquelle
socket.setdefaulttimeout(60)
ist? Wird es für einen Dienst benötigt oder wurde es nur versehentlich von einem vorhandenen Dienst kopiert? :)Obwohl ich die gewählte Antwort vor ein paar Wochen positiv bewertet habe, hatte ich in der Zwischenzeit viel mehr mit diesem Thema zu kämpfen. Es fühlt sich an, als wäre eine spezielle Python-Installation und die Verwendung spezieller Module zum Ausführen eines Skripts als Dienst einfach der falsche Weg. Was ist mit Portabilität und so?
Ich stolperte über den wunderbaren Non-Sucking Service Manager , der es wirklich einfach und vernünftig machte, mit Windows Services umzugehen. Ich dachte, da ich Optionen an einen installierten Dienst übergeben könnte, könnte ich genauso gut meine ausführbare Python-Datei auswählen und mein Skript als Option übergeben.
Ich habe diese Lösung noch nicht ausprobiert, werde dies aber jetzt tun und diesen Beitrag während des Vorgangs aktualisieren. Ich bin auch daran interessiert, virtualenvs unter Windows zu verwenden, daher könnte ich früher oder später ein Tutorial erstellen und hier darauf verlinken.
quelle
new-service
PowerShell dies tun sollte, aber das Starten (und Überwachen) eines Skripts als Dienst beinhaltet offensichtlich viel mehr Details, um die sich nssm sehr gut kümmert.Der einfachste Weg ist die Verwendung von: NSSM - dem Non-Sucking Service Manager:
1 - Download unter https://nssm.cc/download
2 - Installieren Sie das Python-Programm als Dienst: Win-Eingabeaufforderung als Administrator
c:> nssm.exe installiert WinService
3 - Auf der NSSM-Konsole:
Pfad: C: \ Python27 \ Python27.exe
Startverzeichnis: C: \ Python27
Argumente: c: \ WinService.py
4 - Überprüfen Sie die erstellten Dienste auf services.msc
quelle
Der einfachste Weg, dies zu erreichen, ist die Verwendung des nativen Befehls sc.exe:
Verweise:
quelle
Es gibt einige Alternativen für die Installation praktisch jeder ausführbaren Windows-Datei als Dienst.
Methode 1: Verwenden Sie instsrv und srvany aus rktools.exe
Für Windows Home Server oder Windows Server 2003 (funktioniert auch mit WinXP) enthalten die Windows Server 2003 Resource Kit-Tools Dienstprogramme, die zusammen verwendet werden können: instsrv.exe und srvany.exe . Weitere Informationen zur Verwendung dieser Dienstprogramme finden Sie in diesem Microsoft KB-Artikel KB137890 .
Für Windows Home Server gibt es einen großartigen benutzerfreundlichen Wrapper für diese Dienstprogramme mit dem treffenden Namen " Any Service Installer ".
Methode 2: Verwenden Sie ServiceInstaller für Windows NT
Es gibt eine andere Alternative mit ServiceInstaller für Windows NT (hier herunterladbar ) mit verfügbaren Python-Anweisungen . Im Gegensatz zum Namen funktioniert es sowohl mit Windows 2000 als auch mit Windows XP. Hier finden Sie einige Anweisungen zum Installieren eines Python-Skripts als Dienst.
Nach meiner ersten Antwort bemerkte ich, dass bereits eng verwandte Fragen und Antworten auf SO veröffentlicht wurden. Siehe auch:
Kann ich ein Python-Skript als Dienst ausführen (unter Windows)? Wie?
Wie mache ich Windows auf einen Dienst aufmerksam, den ich in Python geschrieben habe?
quelle
NT
dies dem Namen unbedingt "widersprechen" würde, zumindest nicht in der Sprache der Programmierer. Es bezieht sich nur auf die "NT- Architektur " im Gegensatz zur "NT- Marke ". Laut Wikipedia-Vortrag steht dies jedoch zur Debatte, da "es sich nicht um einen offiziellen Microsoft-Begriff handelt", aber es gibt dennoch eine Tradition mit dieser Denkweise.Schritt für Schritt Erklärung, wie es funktioniert:
1- Erstellen Sie zunächst eine Python-Datei gemäß dem oben genannten Grundgerüst. Und speichern Sie es in einem Pfad, zum Beispiel: "c: \ PythonFiles \ AppServerSvc.py"
2 - In diesem Schritt sollten wir unseren Service registrieren.
Führen Sie die Eingabeaufforderung als Administrator aus und geben Sie Folgendes ein:
Das erste Argument von binpath ist der Pfad von python.exe
Das zweite Argument von binpath ist der Pfad Ihrer Python-Datei , die wir bereits erstellt haben
Verpassen Sie nicht, dass Sie nach jedem " = " - Zeichen ein Leerzeichen setzen sollten .
Wenn dann alles in Ordnung ist, sollten Sie sehen
Jetzt ist Ihr Python-Dienst jetzt als Windows-Dienst installiert. Sie können es in Service Manager und Registrierung unter sehen:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService
3- Ok jetzt. Sie können Ihren Dienst über den Service Manager starten.
Sie können jede Python-Datei ausführen, die dieses Service-Skelett bereitstellt.
quelle
SetEvent(self.hWaitStop)
undWaitForSingleObject
. Basierend auf gedankenlosem Kopieren der ausgewählten Antwort hier wahrscheinlich. Dies ist eine gute Möglichkeit, die sowohl für das "Debug" als auch für die "Stop" -Argumente sauber funktioniert. (Der Teil über die Verwendung von SC scheint redundant zu sein, wennHandleCommandLine
der Job ausgeführt wird, und kann debuggen.)pysc: Service Control Manager unter Python
Beispielskript zur Ausführung als Dienst von pythonhosted.org :
quelle
Ich habe angefangen, als Service mit pywin32 zu hosten .
Alles war gut, aber ich habe das Problem festgestellt, dass der Dienst beim Systemstart nicht innerhalb von 30 Sekunden (Standardzeitlimit für Windows) gestartet werden konnte. Dies war für mich von entscheidender Bedeutung, da der Windows-Start gleichzeitig auf mehreren virtuellen Maschinen erfolgte, die auf einer physischen Maschine gehostet wurden, und die E / A-Last enorm war. Fehlermeldungen waren:
Error 1053: The service did not respond to the start or control request in a timely fashion.
Error 7009: Timeout (30000 milliseconds) waiting for the <ServiceName> service to connect.
Ich habe viel mit Pywin gekämpft, aber am Ende habe ich NSSM verwendet, wie es in dieser Antwort vorgeschlagen wurde . Es war sehr einfach, dorthin zu migrieren.
quelle
nssm in Python 3+
(Ich habe meine .py-Datei mit pyinstaller in .exe konvertiert )
nssm: wie gesagt
Auf der NSSM-Konsole:
Pfad: Pfad \ zu \ Ihrer \ program.exe
Startverzeichnis : Pfad \ zu \ Ihrem \ #same als Pfad, jedoch ohne Ihre program.exe
Argumente: leer
Wenn Sie Ihr Projekt nicht in .exe konvertieren möchten
python {{your python.py file name}}
quelle
Ein vollständiges pywin32-Beispiel mit Schleife oder Subthread
Nachdem ich ein paar Tage daran gearbeitet habe, ist hier die Antwort, die ich gerne gefunden hätte: Verwenden Sie pywin32, um es schön und eigenständig zu halten.
Dies ist der vollständige Arbeitscode für eine schleifenbasierte und eine threadbasierte Lösung. Es kann sowohl auf Python 2 als auch auf Python 3 funktionieren, obwohl ich nur die neueste Version auf 2.7 und Win7 getestet habe. Die Schleife sollte für das Abrufen von Code geeignet sein, und das Profil sollte mit mehr serverähnlichem Code funktionieren. Es scheint gut mit dem Kellnerin wsgi Server zu funktionieren, der keine Standardmethode zum ordnungsgemäßen Herunterfahren hat.
Ich möchte auch zu beachten , dass es scheint , gibt jede Menge Beispiele zu sein, wie dies die fast nützlich sind, aber in Wirklichkeit irreführend, weil sie geschnitten und geklebt andere Beispiele haben blind. Ich könnte falsch liegen. Aber warum ein Ereignis erstellen, wenn Sie nie darauf warten?
Trotzdem fühle ich mich hier immer noch auf etwas wackeligem Boden, insbesondere was die Sauberkeit des Ausgangs aus der Thread-Version betrifft, aber zumindest glaube ich, dass es nichts gibt irreführend ist.
Kopieren Sie zum Ausführen einfach den Code in eine Datei und befolgen Sie die Anweisungen.
aktualisieren:
Verwenden Sie ein einfaches Flag, um den Thread zu beenden. Das wichtige Bit ist, dass "Thread erledigt" gedruckt wird.
Ein ausführlicheres Beispiel für das Verlassen eines nicht kooperativen Server-Threads finden Sie in meinem Beitrag über den wsgi-Server der Kellnerin .
quelle
Die akzeptierte Antwort mit
win32serviceutil
funktioniert funktioniert, ist jedoch kompliziert und erschwert das Debuggen und Ändern. Es ist viel einfacher, NSSM ( den Non-Sucking Service Manager) zu verwenden . Sie schreiben ein normales Python-Programm und debuggen es bequem. Wenn es endlich funktioniert, verwenden Sie NSSM, um es in weniger als einer Minute als Dienst zu installieren:An einer Eingabeaufforderung mit erhöhten Rechten (admin) führen
nssm.exe install NameOfYourService
Sie diese aus und geben folgende Optionen ein:C:\Python27\Python.exe
)c:\path\to\program.py
)Übrigens, wenn Ihr Programm nützliche Nachrichten druckt, die Sie in einer Protokolldatei aufbewahren möchten, kann NSSM dies und vieles mehr auch für Sie erledigen.
quelle
Für alle, die einen Service in VENV oder Pycharm erstellen möchten !!!!!!!
Nachdem Sie alle Antworten gelesen und einige Skripte erstellt haben, können Sie
python service.py install
und ausführenpython service.py debug
, aberpython service.py start
keine Antwort.Möglicherweise liegt es an einem venv-Problem, weil der Windows-Dienst Ihren Dienst über exec startet
PROJECT\venv\Lib\site-packages\win32\pythonservice.exe
.Sie können Ihren Dienst verwenden
powershell
odercmd
testen, um weitere Fehlerdetails zu finden.Wenn Sie wie ich einen Fehler erhalten, können Sie meine Antwort in einer anderen Frage überprüfen. Ich habe sie behoben und meinen Code hier veröffentlicht .
quelle
https://www.chrisumbel.com/article/windows_services_in_python
Folgen Sie der PySvc.py
Ändern des DLL-Ordners
Ich weiß, dass das alt ist, aber ich war für immer dabei. Für mich wurde dieses spezielle Problem durch Kopieren dieser Datei - pywintypes36.dll - gelöst
Von -> Python36 \ Lib \ site-packages \ pywin32_system32
Zu -> Python36 \ Lib \ site-packages \ win32
cd C:\Users\user\AppData\Local\Programs\Python\Python38-32
NET START PySvc
NET STOP PySvc
quelle