Dans mon organisation, nous avons un certain nombre de processus de travail consommant des files d'attente. Nous utilisons actuellement SupervisorD pour les gérer, mais nous aimerions utiliser SystemD si possible pour certains avantages. Je suis assez expérimenté dans l'écriture d'unités personnalisées, mais je n'ai pas immédiatement d'analogue dans SystemD Land pour cela.
Dans la documentation de SupervisorD, un paramètre appelé numprocs
est détaillé, ce qui permet de définir le nombre de processus qu'ils souhaitent démarrer avec le service. Si je veux que 30 processus démarrent, c'est un changement d'une ligne.
Existe-t-il un paramètre dans les unités SystemD qui me permettra de spécifier combien de ces processus je souhaiterais démarrer?
systemd
supervisord
Naftuli Kay
la source
la source
Réponses:
Ce que Munir a mentionné, c'est exactement comment vous procédez. Fondamentalement, vous créez un
service
fichier et le démarrez 30 fois. Cela peut sembler un peu maladroit, mais cela présente des avantages, comme la possibilité de fermer l'un d'eux en cas de mauvais comportement et de ne pas avoir à les fermer tous. Vous pouvez également prendre certaines mesures pour faciliter la gestion.Tout d'abord, le fichier d'unité. Créez un fichier, tel que
/etc/systemd/system/[email protected]
. Le bit important est le@
symbole.Son contenu pourrait ressembler à:
Puis commencez avec
systemctl start [email protected]
,systemctl start [email protected]
.Les processus qui seront lancés ressembleront à:
Notez que
%I
vous avez été remplacé par tout ce que vous avez mis après le@
moment où vous l'avez commencé.Vous pouvez commencer les 30 avec un peu de shell-fu:
Vous pouvez également les activer au démarrage comme un service normal:
systemctl enable [email protected]
.Maintenant, ce que je voulais dire par des choses que vous pouvez faire pour faciliter la gestion: peut-être que vous ne voulez pas avoir à utiliser
test@{1..30}.service
pour les gérer tous. C'est un peu lourd. Vous pouvez à la place créer une nouvelle cible pour votre service.Créez
/etc/systemd/system/test.target
avec:Ajustez ensuite le
/etc/systemd/system/[email protected]
pour qu'il ressemble à:Rechargez systemd avec
systemctl daemon-reload
(uniquement nécessaire si vous modifiez le fichier d'unité et que vous n'en avez pas ignoré la version précédente). Et maintenant, activez tous les services que vous souhaitez gérersystemctl enable test@{1..30}.service
.(Si vous aviez précédemment activé le service pendant qu'il l'était
WantedBy=multi-user.target
, désactivez-le d'abord pour effacer la dépendance)Vous pouvez maintenant faire
systemctl start test.target
etsystemctl stop test.target
, et cela démarrera / arrêtera les 30 processus.Et encore une fois, vous pouvez activer au démarrage comme tout autre fichier de l' unité:
systemctl enable test.target
.la source
Restart=on-failure
. Lisez lasystemd.service
page de manuel pour en savoir plus.Voici mon exemple d'utilisation d'un script python qui s'exécute dans un virtualenv:
/etc/systemd/system/[email protected]
Désactiver:
sudo systemctl enable my-worker\@{1..30}.service
Activer N travailleurs:
sudo systemctl enable my-worker\@{1..2}.service
Recharger:
sudo systemctl daemon-reload
Début:
sudo systemctl start [email protected]
Vérifier l'état:
sudo systemctl status my-worker@1
la source