Situación actual
Estoy ejecutando un servidor Linux (Arch). Tengo una aplicación de servidor que se ejecuta así:
run_server filename --port=xxxx
He escrito archivos de servicio systemd. Cada uno mantiene vivo un proceso para un archivo específico en un puerto específico. Cuando quiero entregar un archivo nuevo, copio el archivo de servicio systemd; editarlo; dale un nuevo puerto; y habilitar/iniciar el nuevo servicio.
Esto supone mucho trabajo manual, porque los archivos suelen ser añadidos y eliminados por un equipo de personas.
Pedido
Si tengo un directorio de archivos
directory/firstfile
directory/secondfile
....
Quiero mantener vivo un proceso único para cada archivo:
run_server firstfile --port=9001
run_server secondfile --port=9002
...
Cuando se elimina un archivo del directorio, el proceso debería detenerse. Cuando se agrega un archivo al directorio, se debe iniciar un nuevo proceso.
¿Cómo puedo conseguir esto?
Respuesta1
Bien, elegí una combinación de los consejos de los dos comentaristas.
Creó un archivo de unidad con plantilla systemd ( )
/etc/systemd/system/[email protected]
[Service] Type=simple ExecStart=/../run_server %i ...
Cree un servicio de ruta systemd (
/etc/systemd/system/sync_server_units.path
) que monitoree el directorio[Path] PathModified=/path/to/directory ...
Eso inicia (
/etc/systemd/system/sync_server_units.service
), que es un simple run_once:[Service] Type=oneshot ExecStart=/../sync_server_units
Finalmente tengo un script (
sync_server_units
) que compara el contenido del directorio con la salida desystemctl list-units --all 'run_server@*'
y habilita/inicia/detiene/deshabilita el servicio con plantilla según sea necesario.
¡Funciona bien hasta ahora!