Los servicios de Windows son programas que funcionan en segundo plano sin la necesidad de que un usuario los ejecute. Un concepto similar a los Daemon de los sistemas UNIX. Siendo posible configurarlos para que se inicien al arrancar el sistema, cuando se produce un evento o dejarlos configurados para que sea un usuario quien los ponga en marcha. Los servicios, al igual que los Daemom en UNIX, son una parte clave del sistema operativo Windows existiendo decenas de estos ya que permiten realizar tareas automáticamente sin que un usuario tenga que estar conectado. Configurar un servicio en Windows suele ser algo complicado con las herramientas que vienen por defecto, pero para solucionar este problema se puede recurrir a NSSM (the Non-Sucking Service Manager).
Instalación de NSSM
Antes de poder crear un servicio con NSSM en primer lugar es necesario descargar el programa. Lo que se puede hacer desde la página web del proyecto. Al descargarlo se obtiene un archivo ZIP con el código fuente, una versión compilada para sistemas Windows de 32 bits y otra para los 64 bits. Afortunadamente el programa no requiere instalación, solamente será necesario seleccionar el archivo EXE más adecuado para nuestro sistema y ejecutar esta.
Configurar un servicio en Windows mediante la GUI
Para crear un nuevo servicio con nssm
solamente hay que acceder a la ruta donde se descargó el programa y acceder a la carpeta con el compilado correspondiente a la versión del sistema operativo con el que se está trabajando. Ejecutando en la esta carpeta el siguiente comando
nssm install<servicename>
donde hay que reemplazar <servicename>
por el nombre del servicio que se desea configurar. Habitualmente Windows pedirá confirmación para modificar la configuración del sistema con este programa, lo que se deberá hacer con unas credenciales de administrador. Una vez confirmado que deseamos modificar la configuración del sistema aparecerá una ventana como la siguiente.
Ventana que cuenta con 10 pestañas para configurar las diferentes opciones del servicio, las cuales se explican a continuación.
Application (Aplicación)
La pestaña Application es la única hay que completar en todos los casos, dado que es la que contiene la configuración básica del servicio. En esta se define la ruta donde se encuentra el programa, la carpeta en la que se ejecutará y las opciones que se le han de pasar el servicio. Lo que se debe indicar en los diferentes campos del formulario:
- Path: la ruta al programa que se desea ejecutar como servicio.
- Startup directory: la ruta donde se ejecuta el servicio, esto es, la carpeta en la que por defecto podrá leer archivos de configuraciones y guardar logs.
- Arguments: el listado de parametres que se le pasará al servicio cuando se ejecute.
El campo Path puede ser un algo confuso, ya que es la ruta al programa ejecutable. Cuando se crea un servicio en Python no se debe indicar la ruta al script, sino que la ruta al intérprete de Python. El script con el programa se deberá pasar en el campo Arguments. Si se ha indicado la carpeta donde se encuentra los archivos de script en Startup directory, solamente será necesario indicar el nombre del archivo en Arguments.
Details (Detalles)
La segunda pestaña sirve para darle un nombre y una descripción al servicio. Quizás el punto más importante de esta es si se desea que el servicio se inicie de forma automática o no. Aunque esto se puede cambiar posteriormente.
Log on (Inicio de sesión)
En la pestaña Log on se puede seleccionar la cuenta de usuario que ejecutará el servicio. El propio nssm
comprobará automáticamente si la cuenta indicada tiene los permisos necesarios para iniciar la sesión como servicio.
Dependencies (Dependencias)
Mediante la pestaña Dependencies se puede indicar los servicios o grupos de servicios que deben iniciarse antes del que se está configurando. Evitando de este modo que falle el proceso de arranque por la falta de alguna dependencia.
Process (Procesos)
A través de la pestaña Process se puede indicar la prioridad con la que se ejecutará el servicio y su afinidad. Por defecto, el servicio se ejecuta con prioridad normal y usará todas las CPU. En el caso de que se desee restringir la ejecución del servicio solamente a un subconjunto de las CPU se deberá desmarcar All processors y seleccionar las que se desee.
Shutdown (Apagado)
En la pestaña Shutdown se pueden seleccionar los diversos tiempos de detención y tiempos de espera que se usan al ordenar la aplicación después de un bloqueo o cuando el servicio se detiene correctamente.
Exit actions (Acciones de salida)
La pestaña Exit actions permite modificar el reinicio de la aplicación y la acción predeterminada al finalizar este. Al mismo tiempo también se puede especificar la introducción de un retraso entre los reinicios automáticos del servicio.
I/O (Entrada/Salida, E/S)
Para los casos en los que se necesita redirigir la entrada y salida del servicio a un archivo esto se puede hacer mediante los campos de la pestaña I/O. Generalmente es suficiente con redirigir los valores de salida ( stdout
) y de error ( stderr
) para tener toda la información que el programa puede generar durante su ejecución. Algo con lo que se pude conseguir un log básico del servicio.
File rotation (Rotación de archivos)
La pestaña File rotation se debe usar junto la anterior para definir la política de rotación de archivos E/S. Para eliminar los archivos generados después de un tiempo, evitando de esta manera que el espacio ocupado por el log en el disco crezca sin límite.
Environment (Entorno)
Finalmente, mediante la pestaña Enviroment se puede especificar una lista de variables de entorno, una en cada línea, que se pasan a la aplicación. Si la casilla de verificación Replace default environment (Reemplazar entorno predeterminado) se selecciona el servicio únicamente recibirá las variables indicadas aquí, eliminando los valores por defecto. Por otro lado, si se dejan sin marcar se combina ambas.
Configurar un servicio en Windows mediante la línea de comandos
Aunque la interfaz gráfica es muy útil para iniciar los diferentes servicios, si se desea realizar un único cambio puede ser más rápido usar la línea de comandos. Para modificar una opción de un servicio solamente se tiene que pasar el parámetro adecuado a nssm
. Así para crear un servicio básico escrito en Python desde la línea de comando solamente se tendrá que escribir.
nssm set myservice Application "C:\Python\Python 3.9\python.exe" nssm set myservice AppDirectory "C:\Services" nssm set myservice AppParameters myservice.py
En la primera línea se crea un servicio llamado myservice
que se va a ejecutar con Python 3.9. Indicando en esta línea la ruta al intérprete. Posteriormente, en la segunda línea, se indica la ruta donde se ejecutará, una carpeta en el disco duro a la que se llama Services
. Finalmente se indica el archivo con el código Python que se desea ejecutar, en este caso myservice.py
que debe estar ubicado en C:\Services
.
Conclusiones
En esta entrada hemos visto una solución para configurar los servicios en Windows de una forma más eficiente que la que existe por defecto. Facilitando enormemente esta tarea. Quizás no sea algo que se hace habitualmente, pero saber configurar un servicio en Windows puede ser de ayuda cuando es necesario.