web-dev-qa-db-fra.com

service systemd avec plusieurs After

Est-il possible de créer un service qui dépend de plusieurs autres services? Quelle est la bonne syntaxe?

Tel que:

[Unit]
Description=service description
Wants=network.target
After=network.target
After=syslog.target

[Service]
User=bootapp
ExecStart=/var/app/app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

L'objectif est de démarrer un service automatiquement après le redémarrage du système d'exploitation et de s'assurer que les services de journalisation et de mise en réseau sont démarrés avant le service.

Question supplémentaire: dois-je spécifier Restart?

3
naXa

Le fichier d'unité que vous avez publié semble correct. Mais l'unité telle que vous l'avez définie ici n'a pas de dépendances strictes, seulement faible (Wants= au lieu de Requires=). Cela signifie que si network.target n'est pas là ou s'il ne démarre pas, cette unité sera démarrée de toute façon. After= (et Before=) est utilisé uniquement pour la commande, pas pour la gestion des dépendances. Donc, si votre application a besoin d'un autre service, utilisez Requires=. S'il a besoin de ce service avant il peut être démarré lui-même, utilisez After= aditionellement.

Pour permettre à votre unité de démarrer automatiquement après le démarrage, vous devez l'activer. Systemd a besoin de savoir où le lier pour commencer, c'est ce que WantedBy= dans le [Install] section est utilisée pour. Après avoir édité le fichier d'unité et l'avoir enregistré dans /etc/systemd/system/my-unit.service vous devez recharger le démon systemd pour qu'il prenne la nouvelle unité, avant de pouvoir l'activer; la commande est systemctl daemon-reload. Pour activer le type d'unité systemctl enable my-unit.service. Cela ajoute un lien symbolique dans /etc/systemd/system/multi-user.target.wants/ à votre fichier d'unité.

Pour le démarrer manuellement, vous pouvez taper systemctl start my-unit.service.

Restart= n'est nécessaire que si vous souhaitez que votre application soit redémarrée automatiquement à sa fermeture. Il existe différentes possibilités pour redémarrer, comme on-failure ou always (plus dans la page de manuel de systemd.service).

Votre app.jar doit également être exécutable pour que cela fonctionne. Si c'est le cas et qu'il démarre votre application, alors ça va. Je pense qu'un pot doit être démarré par qc. comme Java -jar app.jar, mais ofc. Je peux me tromper ici.

7
nix