Les processus SystemD génèrent-ils N?

13

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é numprocsest 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?

Naftuli Kay
la source
1
Essayez-vous de créer plusieurs instances de la même unité? Si oui, vous voudrez peut-être regarder 0pointer.de/blog/projects/instances.html
Munir

Réponses:

31

Ce que Munir a mentionné, c'est exactement comment vous procédez. Fondamentalement, vous créez un servicefichier 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 à:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

Puis commencez avec systemctl start [email protected], systemctl start [email protected].
Les processus qui seront lancés ressembleront à:

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

Notez que %Ivous 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:

systemctl start test@{1..30}.service

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}.servicepour 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.targetavec:

[Install]
WantedBy=multi-user.target

Ajustez ensuite le /etc/systemd/system/[email protected]pour qu'il ressemble à:

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

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érer systemctl 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.targetet systemctl 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.

Patrick
la source
Merci pour cette réponse détaillée, j'ai cherché cela pendant plusieurs jours.
arnolem
1
Savez-vous si cela redémarrera les processus qui échouent?
Bastian
@bastian: vous pouvez utiliser Restart=on-failure. Lisez la systemd.servicepage de manuel pour en savoir plus.
siride
1

Voici mon exemple d'utilisation d'un script python qui s'exécute dans un virtualenv:

/etc/systemd/system/[email protected]

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

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

radtek
la source