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.
Criou um arquivo de unidade modelado no systemd ( )
/etc/systemd/system/[email protected]
[Service] Type=simple ExecStart=/../run_server %i ...
Crie um serviço de caminho systemd (
/etc/systemd/system/sync_server_units.path
) que monitore o diretório[Path] PathModified=/path/to/directory ...
Isso inicia (
/etc/systemd/system/sync_server_units.service
), que é um simples run_once:[Service] Type=oneshot ExecStart=/../sync_server_units
Finalmente, tenho um script (
sync_server_units
) que compara o conteúdo do diretório com a saída desystemctl list-units --all 'run_server@*'
e ativa/inicia/para/desativa o serviço de modelo conforme necessário.
Funciona bem até agora!