Mantenha um servidor ativo para cada arquivo em um diretório

Mantenha um servidor ativo para cada arquivo em um diretório

Situação atual

Estou executando um servidor Linux (Arch). Eu tenho um aplicativo de servidor que é executado assim:

run_server filename --port=xxxx

Eu escrevi arquivos de serviço do systemd. Cada um mantém um processo ativo para um arquivo específico em uma porta específica. Quando quero servir um novo arquivo, copio o arquivo de serviço systemd; Edite-o; dê-lhe uma nova porta; e ativar/iniciar o novo serviço.

É muito trabalho manual, porque os arquivos geralmente são adicionados e removidos por uma equipe de pessoas.

Solicitar

Se eu tiver um diretório de arquivos

directory/firstfile
directory/secondfile
....

Quero manter ativo um único processo para cada arquivo:

run_server firstfile --port=9001
run_server secondfile --port=9002
...

Quando um arquivo é removido do diretório, o processo deve parar. Quando um arquivo é adicionado ao diretório, um novo processo deve ser iniciado.

Como posso conseguir isso?

Responder1

Ok, segui uma combinação dos conselhos dos dois comentaristas.

  1. Criou um arquivo de unidade modelado no systemd ( )/etc/systemd/system/[email protected]

    [Service]
    Type=simple
    ExecStart=/../run_server %i
    ...
    
  2. Crie um serviço de caminho systemd ( /etc/systemd/system/sync_server_units.path) que monitore o diretório

    [Path]
    PathModified=/path/to/directory
    ...
    
  3. Isso inicia ( /etc/systemd/system/sync_server_units.service), que é um simples run_once:

    [Service]
    Type=oneshot
    ExecStart=/../sync_server_units
    
  4. Finalmente, tenho um script ( sync_server_units) que compara o conteúdo do diretório com a saída de systemctl list-units --all 'run_server@*'e ativa/inicia/para/desativa o serviço de modelo conforme necessário.

Funciona bem até agora!

informação relacionada