Redémarrez le service Systemd automatiquement chaque fois qu'un répertoire change (n'importe quel fichier à l'intérieur)

25

Comment redémarrer un service Systemd lors d'un changement de fichier. J'ai un service Java que je veux recharger quand un fichier jar change.

Voici ma configuration:

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/

J'ai également essayé d'utiliser PathChangedet d'utiliser un fichier à la place d'un répertoire.

Lorsque j'ai installé le service, j'ai exécuté: sudo systemctl daemon-reloadet sudo systemctl enable srv

Merci!

brouillage
la source
2
Non testé donc pas une réponse, mais d'après la documentation il semble que les pathunités ne sont utiles que pour activer (démarrer) d'autres unités. Ici, vous pourriez probablement créer srv-restart.pathavec PathChanged=/opt/srv/lib/et srv-restart.serviceavec ExecStart=systemctl restart srv.service.
Michał Politowski
Il semble que si vous le nommez comme le service (avec .path) le fichier de chemin fait référence au même service: freedesktop.org/software/systemd/man/systemd.path.html cependant ... je ne sais pas s'il ne démarre qu'un service ou même le redémarre s'il est déjà en cours d'exécution
brouillage le
Si je comprends bien la documentation, srv.pathne peut faire que l'équivalent de systemclt start srv.service, donc pour automatiser les redémarrages, vous aurez besoin d'un autre service qui, une fois démarré, redémarre votre service.
Michał Politowski
Vous devez le démarrer systemctl start srv.path- et le faire démarrer au démarragesystemctl preset srv.path
Michael D.
1
Pertinent: github.com/systemd/systemd/issues/4324
Michał Politowski

Réponses:

22

Le commentaire de Michal Politowski est exactement correct. J'utilise cette méthode pour redémarrer automatiquement les services lorsque de nouveaux artefacts sont déployés. C'est très utile.

Pour être clair, vous avez besoin de:

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
la source
6
Existe-t-il des garanties sur le moment où cela se déclenche si de nombreux fichiers sont modifiés rapidement?
Rich Remer
3
Il est important de se rappeler que l'unité «.path» doit également être activée. Dans ce cas:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Pau Ruŀlan Ferragut
1
Si votre service de redémarrage n'est pas du même nom que le .path fichier, ajoutez simplement Unit=nameofmyrestart.serviceà la [Path]section de votre .pathfichier. freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler
Fonctionne très bien dans CentOS pour redémarrer Kestrel (ASP.NET Core)
Suleman