Sto lavorando a un progetto per eseguire Python APScheduler come servizio di Windows con i risultati in un file di testo. Posso installare e avviare il servizio senza intoppi.Come eseguire APScheduler all'interno di un servizio di Windows ... Sono quasi arrivato
Ho provato un paio di modi per eseguire lo scheduler all'interno di un servizio con il risultato più comune e frustrante che quando interrompo il servizio il thread dello scheduler continua a scrivere nel file di testo. Devo riavviare il computer per uccidere il thread.
Ho provato uno scheduler di 'blocco' e 'background' e si comportano allo stesso modo.
Ho giocato con lo spostamento di scheduler.shutdown() in luoghi diversi. Vorrei metterlo nella funzione di arresto del servizio e fare in modo che lo schedulatore funzioni finché il servizio non riceve un comando di stop, dopodiché la funzione di arresto del servizio gestirà l'arresto dello scheduler.
Forse puoi indicarmi la direzione giusta? Ecco il codice disinfettato per assicurarti di non dover riavviare il tuo computer.
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import time
import logging
import configparser
import os
from datetime import datetime
from mysql.connector import errorcode
from apscheduler.schedulers.background import BackgroundScheduler
global FILEPATH
global SERVICE
#Define constants
FILEPATH = os.path.dirname(os.path.realpath(__file__))
SERVICE = 'service.log'
logging.basicConfig(
filename = '%s\\%s' % (FILEPATH, SERVICE),
level = logging.DEBUG,
format = '[Logging Service] %(levelname)-7.7s %(message)s'
)
def hi(text):
logging.info(text)
return
class HelloWorldSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "Logging-Service"
_svc_display_name_ = "Logging Service"
_svc_description_ = "Periodically logs information"
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
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.stop_event)
logging.info('Stopping service ...')
self.stop_requested = True
def SvcDoRun(self):
servicemanager.LogMsg(
servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,'')
)
self.main()
def main(self):
logging.info(' ** Starting Logging Operation ** ')
scheduler = BackgroundScheduler()
scheduler.add_job(hi, 'interval', seconds=5, args=['arg text'])
scheduler.start()
time.sleep(15)
scheduler.shutdown()
time.sleep(10)
logging.info('Ended')
return
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(HelloWorldSvc)
Potete per favore elaborare? Dove va questo? Qual è la variabile della macchina? – ForgottenKahz