2014-12-08 14 views
5

Pracuję nad projektem, aby uruchomić Python APScheduler jako usługę Windows, a wyniki będą przesyłane do pliku tekstowego. Mogę zainstalować i uruchomić usługę bez żadnych problemów.Jak uruchomić APScheduler wewnątrz usługi Windows ... Już prawie jestem

Próbowałem kilka sposobów uruchamiania programu szeregującego w usłudze z najbardziej powszechnym i frustrującym skutkiem, że po zatrzymaniu usługi wątek harmonogramu nadal zapisuje do pliku tekstowego. Muszę ponownie uruchomić komputer, aby zabić wątek.

Próbowałem już programów blokujących i "tła" i zachowują się tak samo.

Grałem z przeniesieniem scheduler.shutdown() w różne miejsca. Chciałbym umieścić go w funkcji zatrzymania usługi i mieć harmonogramu uruchomić, dopóki usługa otrzyma polecenie zatrzymania, po której funkcja zatrzymania usługi poradziłby wyłączyć harmonogramu.

Być może wskażesz mi właściwy kierunek? Oto kod sanityzowany, aby upewnić się, że nie będziesz musiał ponownie uruchamiać komputera.

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) 

Odpowiedz

1

Czy próby zatrzymania go tak:

win32serviceutil.StopService(service, machine) 
+0

Czy mógłbyś rozwinąć? Dokąd to zmierza? Jaka jest zmienna maszyny? – ForgottenKahz

Powiązane problemy