Reinicie el servicio Systemd automáticamente cada vez que cambie un directorio (cualquier archivo dentro de él)

25

¿Cómo reinicio un servicio Systemd cuando cambia un archivo? Tengo un servicio de Java que quiero recargar cuando cambia cualquier archivo jar.

Esta es mi configuración:

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/

También intenté usar PathChangedy usar un archivo en lugar de un directorio.

Cuando instalé el servicio que ejecuté: sudo systemctl daemon-reloady sudo systemctl enable srv

¡Gracias!

interferencia
fuente
2
No probado, así que no es una respuesta, pero según la documentación parece que las pathunidades solo son útiles para activar (iniciar) otras unidades. Aquí probablemente puedas crear srv-restart.pathcon PathChanged=/opt/srv/lib/y srv-restart.servicecon ExecStart=systemctl restart srv.service.
Michał Politowski
Parece que si lo nombra igual que el servicio (con .path), el archivo de ruta se refiere al mismo servicio: freedesktop.org/software/systemd/man/systemd.path.html sin embargo ... No sé si solo inicia un servicio o incluso lo reinicia si ya se está ejecutando
atascando el
Según tengo entendido por los documentos, srv.pathsolo puede hacer el equivalente de systemclt start srv.service, por lo que para automatizar reinicios necesitará otro servicio, que cuando se inicia reinicia su servicio.
Michał Politowski
Necesitas iniciarlo systemctl start srv.path, y que comience en el arranquesystemctl preset srv.path
Michael D.
1
Relevante: github.com/systemd/systemd/issues/4324
Michał Politowski

Respuestas:

22

El comentario de Michal Politowski es exactamente correcto. Utilizo este método para reiniciar automáticamente los servicios cuando se implementan nuevos artefactos. Es de mucha ayuda.

Para ser claro, necesitas:

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
fuente
66
¿Hay alguna garantía sobre cuándo se activa esto si se cambian muchos archivos en rápida sucesión?
Rich Remer
3
Es importante recordar que la unidad «.path» también debe estar habilitada. En este caso:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Pau Ruŀlan Ferragut
1
Si su servicio de reinicio no tiene el mismo nombre que el .path archivo, simplemente agréguelo Unit=nameofmyrestart.servicea la [Path]sección de su .patharchivo. freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler
Funciona bien en CentOS para reiniciar Kestrel (ASP.NET Core)
Suleman