Python-Dienst

Windows-Dienst [pywin32]

Sie können ein Python-Programm mit bat ausführen, aber es ist benutzerfreundlich, wenn Sie das ausgeführte Programm in einen Dienst verwandeln können, da Sie nicht wissen, was ausgeführt wird.

Also werde ich zusammenfassen, wie man sich als System registriert

Einstellmethode

  1. Sie müssen den Pfad durch die Systemumgebungsvariablen übergeben Systemsteuerung \ System und Sicherheit \ System Erweiterte Systemeinstellungen → Umgebungsvariablen

Überprüfen Sie, ob der "Pfad" der "Systemumgebungsvariablen" Folgendes enthält

C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\
C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Scripts\

Fügte auch Folgendes hinzu

C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Lib\site-packages\pywin32_system32
C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Lib\site-packages\win32
  1. Führen Sie an der Eingabeaufforderung mit Administratorrechten aus Hinweis: Ausführen vom Administrator Suchen Sie nach cmd → Eingabeaufforderungs-App → Klicken Sie mit der rechten Maustaste und führen Sie sie vom Administrator aus
pip install pywin32
  1. Serviceregistrierung (automatischer Verzögerungsstart) Öffnen Sie nach dem Wechseln in das Verzeichnis mit der zu systematisierenden Python-Datei eine Eingabeaufforderung mit Administratorrechten und führen Sie den folgenden Befehl aus.
$ python test.py --startup delayed install
  1. Dienstausführung Öffnen Sie eine Eingabeaufforderung mit Administratorrechten und führen Sie den folgenden Befehl aus.
$ python test.py start
  1. Serviceausfall Öffnen Sie eine Eingabeaufforderung mit Administratorrechten und führen Sie den folgenden Befehl aus.
$ python test.py stop
  1. Dienst löschen Öffnen Sie eine Eingabeaufforderung mit Administratorrechten und führen Sie den folgenden Befehl aus.
$ python test.py remove

Beispielcode 1

# -*- coding:utf-8 -*-

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket

import time
import threading
import logging
import random

logging.basicConfig(
    filename = 'c:\\work\\test-service.log',
    level = logging.DEBUG, 
    format="%(asctime)s:LINE[%(lineno)s] %(levelname)s %(message)s"
)

INTERVAL = 10

class MySvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "test-service"
    _svc_display_name_ = "test service"

    #Klasseninitialisierung
    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.stop_event = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)
        self.stop_requested = False

    #Dienstausfall
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stop_event)
        logging.info('Request to Stop Service...')
        self.stop_requested = True

    #Start des Dienstes
    def SvcDoRun(self):
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STARTED,
            (self._svc_name_,'')
        )
        
        #Funktionsaufruf der Hauptschleife
        self.main_loop()
        
    #Hauptverarbeitungsfunktion
    def main_task(self):
        logging.debug('mainTask Start...55sec sleep')
        # time.sleep(55)
        logging.debug('Do Something...after 55sec')
    
    #Hauptschleifenfunktion
    def main_loop(self):
        logging.info('Start des Dienstes')
        exec_time = time.time()
        
        #Schleifenverarbeitung
        while True:
            #Bestätigung der Endanforderung
            if self.stop_requested:
                logging.info('Dienst anhalten')
                break
                
            try: 
                #Wenn das Ausführungsdatum und die Ausführungszeit überschritten werden
                if exec_time <= time.time():
                    
                    #Hauptverarbeitungsaufruf
                    self.main_task()
                    
                    #Stellen Sie die nächste Ausführungszeit ein
                    exec_time = exec_time + INTERVAL
                    
            except Exception as e:
                logging.error("Error occured.")
                
            # 0.1 Sekunde Schlaf
            time.sleep(0.1)

        logging.info("Dienstausfall")
        return

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(MySvc)

Beispielcode 2

.py:servicetest.py


import os
import win32service 
import win32serviceutil 
import win32event 
import datetime 
 
class SmallestPythonService(win32serviceutil.ServiceFramework): 
    #Dienstname
    _svc_name_ = "TESTServise" 
    #Anzeigename(Zeigen Sie dies auf dem Servicebildschirm an) 
    _svc_display_name_ = "TEST Service" 
    #Leistungsbeschreibung
    _svc_description_='Speichern Sie die Daten in regelmäßigen Abständen in der Gerätebetriebstabelle' 
    #Timeout-Zeit, um auf das Signal zu warten(Diesmal 10 Sekunden= 10,000 Millisekunden) 
    _timeout_Milliseconds = 10000 
 
    def __init__(self, args): 
        win32serviceutil.ServiceFramework.__init__(self, args) 
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 
 
    def SvcStop(self): 
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
        win32event.SetEvent(self.hWaitStop) 
 
    def SvcDoRun(self): 
        print('Start des Dienstes') 
        while 1: 
            #Warten Sie 10 Sekunden auf die Ereignissignalisierung
            ret = win32event.WaitForSingleObject( 
                    self.hWaitStop, 
                    self._timeout_Milliseconds 
                    ) 
                #Dienstausfall(Ereignisse werden signalisiert)Wenn ja, beenden Sie die Verarbeitung
            if ret == win32event.WAIT_OBJECT_0: 
                break 
 
            self.main_loop() 
 
    #Tatsächliche Serviceverarbeitung
    def main_loop(self): 
 
        # print('Start des Dienstes') 
        #↓ ↓ Für Test Test im Ausführungsverzeichnis gelöscht.Testen Sie OK, sobald txt erstellt wurde
        FILEADDR = os.path.dirname(os.path.abspath(__file__)) + '/test.txt'
        with open(FILEADDR, "a") as f:
            f.write("[Test] %s \n" % (datetime.datetime.now())) 
 
if __name__=='__main__': 
    win32serviceutil.HandleCommandLine(SmallestPythonService) 

Recommended Posts

Python-Dienst
Python
Kafka Python
Python-Grundlagen ⑤
Python-Zusammenfassung
Eingebaute Python
Python-Technik
Python studieren
Python 2.7 Countdown
Python-Memorandum
Python-Tipps
Python-Funktion ①
Python-Grundlagen
Python-Memo
Ufo-> Python (3)
Python-Einschlussnotation
Installieren Sie Python
Python Singleton
Python-Grundlagen ④
Python-Memorandum 2
Python-Memo
Python Jinja2
Python-Inkrement
atCoder 173 Python
[Python] -Funktion
Python-Installation
Python installieren 3.4.3.
Versuchen Sie Python
Python-Memo
Python iterativ
Python-Algorithmus
Python2 + word2vec
[Python] -Variablen
Python-Funktionen
Python sys.intern ()
Python-Tutorial
Python-Fraktion
Python Underbar Das ist was
Python-Zusammenfassung
Starten Sie Python
[Python] Sortieren
Hinweis: Python
Python-Grundlagen ③
Python-Protokoll ausgeben
Python-Grundlagen
[Scraping] Python-Scraping
Python-Update (2.6-> 2.7)
Python-Memo
Python-Memorandum
Python #sort
Ufo-> Python
Python nslookup
Python lernen
[Rpmbuild] Python 3.7.3.
Prorate Python (1)
Python Memorandum
Laden Sie Python herunter
Python Memorandum