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)
Czy mógłbyś rozwinąć? Dokąd to zmierza? Jaka jest zmienna maszyny? – ForgottenKahz