Mantenga activo un servidor para cada archivo en un directorio

Mantenga activo un servidor para cada archivo en un directorio

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.

  1. Creó un archivo de unidad con plantilla systemd ( )/etc/systemd/system/[email protected]

    [Service]
    Type=simple
    ExecStart=/../run_server %i
    ...
    
  2. Cree un servicio de ruta systemd ( /etc/systemd/system/sync_server_units.path) que monitoree el directorio

    [Path]
    PathModified=/path/to/directory
    ...
    
  3. Eso inicia ( /etc/systemd/system/sync_server_units.service), que es un simple run_once:

    [Service]
    Type=oneshot
    ExecStart=/../sync_server_units
    
  4. Finalmente tengo un script ( sync_server_units) que compara el contenido del directorio con la salida de systemctl list-units --all 'run_server@*'y habilita/inicia/detiene/deshabilita el servicio con plantilla según sea necesario.

¡Funciona bien hasta ahora!

información relacionada