Je prévois d'héberger plusieurs instances de la même application Web pour les clients utilisant systemd
. Je voudrais pouvoir stop
et start
chaque instance de client à l' aide systemd
, ainsi que le traitement de toute la collection des instances de clients comme un service unique qui peut être arrêté et démarré ensemble.
systemd
semble fournir les blocs de construction dont j'ai besoin PartOf
et les fichiers d'unité de modèle, mais je suis allé arrêter le service parent, le service client enfant n'est pas arrêté. Comment puis-je faire fonctionner cela avec systemd? Voici ce que j'ai jusqu'à présent.
Le fichier de l' unité mère, app.service
:
[Unit]
Description=App Web Service
[Service]
# Don't run as a deamon (because we've got nothing to do directly)
Type=oneshot
# Just print something, because ExecStart is required
ExecStart=/bin/echo "App Service exists only to collectively start and stop App instances"
# Keep running after Exit start finished, because we want the instances that depend on this to keep running
RemainAfterExit=yes
StandardOutput=journal
Un fichier de modèle d'unité nommé [email protected]
, utilisé pour créer des instances client:
[Unit]
Description=%I Instance of App Web Service
[Service]
PartOf=app.service
ExecStart=/home/mark/bin/app-poc.sh %i
StandardOutput=journal
Mon app-poc.sh
script (preuve de concept qui s'imprime simplement dans un fichier journal en boucle):
#!/bin/bash
# Just a temporary code to fake a full daemon.
while :
do
echo "The App PoC loop for $@"
sleep 2;
done
Pour la preuve de concept, j'ai les fichiers d'unité systemd dedans ~/.config/systemd/user
.
Je lance ensuite le parent et une instance basée sur le modèle (après systemctl --user daemon-reload
):
systemctl --user start app
systemctl --user start [email protected]
En utilisant, journalctl -f
je peux voir que les deux ont démarré et que l'instance client continue de s'exécuter. Maintenant, je m'attends à ce que l'arrêt du parent arrête l'enfant (parce que je l'ai utilisé PartOf
), mais ce n'est pas le cas. De plus, démarrer le parent ne démarre pas l'enfant comme prévu non plus.
systemctl --user stop app
Merci!
(J'utilise Ubuntu 16.04 avec systemd 229).
Requires=
place?Réponses:
Vous devez déplacer la ligne
sur
[Service]
et dans la[Unit]
section, et ajouter à la[Unit]
deapp.service
la liste des clients pour commencer, par exemple ,ou comme l'a dit sourcejedi dans les commentaires,
Requires=
la même chose. Vous pouvez conserver lesPartOf
services d'arrêt que vous démarrez manuellement, qui ne figurent pas dans la liste ci-dessus, commesystemctl --user start [email protected]
.la source
PartOf
. Merci. Je vais gérer les "Wants" via un lien symbolique, qui devient la seule action que je dois prendre pour activer un nouveau client avec systemd. Pour mon scénario de test: `ln -s /home/mark/.config/systemd/user/[email protected] / home / mark / .config / systemd / user / app.service.wants / unit @ foo.service`J'ai appris que c'est à cela que servent les «unités cibles» systémiques. En utilisant une unité cible, j'obtiens les avantages que je veux sans avoir besoin de créer la fausse
[Service]
section que j'avais ci-dessus. Un exemple de fichier de travail "Unité cible" ressemble à ceci:Ensuite, chaque instance client doit inclure
PartOf
dans la[Unit]
section (comme indiqué par @meuh), et doit également avoir une[Install]
section pour queenable
etdisable
fonctionne sur le service spécifique:Pour afficher l'instance client et la faire démarrer au démarrage de la cible, cette commande d'activation unique est utilisée:
À ce stade, je peux utiliser
stop
etstart
continuerapp@customer
pour une instance spécifique, ou je peux utiliserstart app
etstop app
arrêter toutes les applications ensemble.la source
systemctl status $(systemctl list-dependencies --plain otp.target)
systemd
pourrait améliorer la convivialité ici. J'ai ouvert une demande de fonctionnalité pour suggérer un statut amélioré pour les cibles.