2014-12-08 5 views
5

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) 

risposta

1

hai provato fermare in questo modo:

win32serviceutil.StopService(service, machine) 
+0

Potete per favore elaborare? Dove va questo? Qual è la variabile della macchina? – ForgottenKahz

Problemi correlati