Reinicie o serviço Systemd automaticamente sempre que um diretório for alterado (qualquer arquivo dentro dele)

24

Como reinicio um serviço Systemd quando um arquivo é alterado. Eu tenho um serviço Java que quero recarregar quando qualquer arquivo jar for alterado.

Esta é a minha configuração:

srv.service

[Unit]
Description=srv 0.1: Service's description
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/srv
ExecStart=/opt/srv/bin/srv
User=root
Group=root

[Install]
WantedBy=multi-user.target

srv.path

[Path]
PathModified=/opt/srv/lib/

Eu também tentei usar PathChangede usar um arquivo em vez de um diretório.

Quando instalei o serviço, executei: sudo systemctl daemon-reloade sudo systemctl enable srv

Obrigado!

interferência
fonte
2
Não testado, não há resposta, mas a partir da documentação, parece que as pathunidades são úteis apenas para ativar (iniciar) outras unidades. Aqui você provavelmente poderia criar srv-restart.pathcom PathChanged=/opt/srv/lib/e srv-restart.servicecom ExecStart=systemctl restart srv.service.
Michał Politowski 26/01
Parece que se você nomear o mesmo que o serviço (com .path), o arquivo de caminho se refere ao mesmo serviço: freedesktop.org/software/systemd/man/systemd.path.html, no entanto ... não sei se apenas iniciar um serviço ou até reiniciá-lo se já estiver em execução
bloqueando
Pelo que entendi nos documentos, srv.pathsó pode fazer o equivalente a systemclt start srv.service, portanto, para automatizar as reinicializações, você precisará de outro serviço, que, quando iniciado, reinicia o serviço.
Michał Politowski 26/01
Você precisa iniciá-lo systemctl start srv.path- e começar com o bootsystemctl preset srv.path
Michael D.
11
Relevante: github.com/systemd/systemd/issues/4324
Michał Politowski

Respostas:

21

O comentário de Michal Politowski está exatamente correto. Eu uso esse método para reiniciar automaticamente os serviços quando novos artefatos são implementados. É muito útil.

Para ser claro, você precisa:

srv.service

[Unit]
Description=srv 0.1: Service's description
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/srv
ExecStart=/opt/srv/bin/srv
User=root
Group=root

[Install]
WantedBy=multi-user.target

srv-watcher.service

[Unit]
Description=srv restarter
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart srv.service

[Install]
WantedBy=multi-user.target

srv-watcher.path

[Path]
PathModified=/opt/srv/lib

[Install]
WantedBy=multi-user.target
John
fonte
6
Existem garantias sobre quando isso é acionado se muitos arquivos forem alterados em rápida sucessão?
Rich Remer
3
É importante lembrar que a unidade «.path» também precisa estar ativada. Neste caso:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Pau Ruŀlan Ferragut 13/04/19
11
Se o seu serviço de reinicialização não tiver o mesmo nome que o .path arquivo, adicione Unit=nameofmyrestart.service-o à [Path]seção do .patharquivo. freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler 19/03/19
Funciona bem no CentOS para reiniciar Kestrel (ASP.NET Core)
Suleman