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!


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.

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.