nssm manager creator python windows windows-services pywin32

manager - No se puede iniciar el servicio de Windows escrito en Python(win32serviceutil)



windows service creator (5)

Además, gracias por señalar que podría ser un problema de DLL, eso me llevó a encontrar la solución correcta.

Lo que hay que hacer es agregar Python27 a SYSTEM PATH, y no a USER PATH, ya que, de manera predeterminada, el servicio de python se instalará como ''LocalSystem'', por lo que cuando intenta iniciarlo, utiliza la variable SYSTEM PATH. Por qué puede ejecutarlo desde el símbolo del sistema, su ruta de usuario es correcta.

¡Espero eso ayude!

Estoy tratando de comenzar un ejemplo de servicio simple:

someservice.py:

import win32serviceutil import win32service import win32event class SmallestPythonService(win32serviceutil.ServiceFramework): _svc_name_ = "SmallestPythonService" _svc_display_name_ = "display service" 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): win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) if __name__==''__main__'': win32serviceutil.HandleCommandLine(SmallestPythonService)

Cuando corro

python someservice.py install

todo está bien y el servicio aparece en la lista de servicios de Windows, pero

python someservice.py start

falla con "Error 1053: El servicio no respondió a la solicitud de inicio o control de manera oportuna", pero no hay ningún retraso.

Busqué en Google una solución que decía que sucede cuando pythonservice.exe no puede localizar python27.dll . Realmente no se pudo, así que agregué C:/Python27 a PATH . Ahora pythonservice.exe ejecuta bien, pero el error 1053 sigue ahí.

Estoy ejecutando Python 2.7.2 con pywin32 216 en Windows 7 Ultimate con privilegios de administrador.


Creo que su problema se solucionará si cambia el método SvcDoRun

desde

def SvcDoRun(self): win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

a

def SvcDoRun(self): self.ReportServiceStatus(win32service.SERVICE_RUNNING) win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)


Otro consejo útil es agregar la siguiente línea.

sys.frozen = ''windows_exe'' # Fake py2exe so we can debug

antes de llamar

win32serviceutil.HandleCommandLine(...)

De esa manera, puede obtener más información útil del servicio de lo que sale mal.


Puedo ejecutar el servicio siguiendo estos procedure usando Python 3.5 y PyInstaller


También tuve este problema y pude resolverlo agregando lo siguiente a mi bloque de ejecución "__main__" :

if len(sys.argv) == 1: servicemanager.Initialize() servicemanager.PrepareToHostSingle(RouterService) servicemanager.StartServiceCtrlDispatcher() else: win32serviceutil.HandleCommandLine(RouterService)

(No olvide importar el administrador de servicios en la parte superior del archivo).

Creo que el problema es que el administrador de servicios de Windows ejecuta el ejecutable sin argumentos (de manera predeterminada) y cuando este es el caso, la aplicación necesita que se le SvcDoRun correctamente que inicie el servicio, no parece que se llame a SvcDoRun automáticamente.

Como han mencionado otros, necesita una asignación de ruta si la ejecuta desde la línea de comandos. En mi aplicación, congelé el servicio con cx_freeze y utilicé el ejecutable para instalar el servicio para que se incluyeran todas las dependencias.