Systemd: redémarrez toutes les instances d'un service instancié à la fois

17

J'utilise la fonctionnalité intéressante de systemd: services instanciés.

Existe-t-il un moyen simple de recharger tous les services instanciés en un seul appel?

Exemple: je ne veux pas tout exécuter comme ceci:

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu

J'ai essayé ça, mais ça ne marche pas

systemctl restart autossh@*

Connexes: démarrez N processus avec un fichier de service systemd

Mise à jour

J'ai d'abord été fasciné par les services instanciés, mais plus tard, j'ai réalisé que l'exécution d'un outil de gestion de configuration comme Ansible était plus logique. J'ai appris: Gardez les outils simples. De nombreux outils commencent à implémenter la vérification des conditions (si .. sinon ...) et des boucles. Par exemple, serveurs Web ou configuration de serveurs de messagerie. Mais cela devrait être résolu à un niveau différent (supérieur): la gestion de la configuration. Voir: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

guettli
la source

Réponses:

23

Systemd (à partir de systemd-209) prend en charge les caractères génériques, mais votre shell essaie probablement de les étendre. Utilisez des guillemets pour transmettre les caractères génériques à la commande systemctl / service textuellement:

systemctl restart 'autossh@*'
weirdan
la source
Ne fonctionne pas pour moi: systemctl status 'autossh@*'sortie: autossh@\x2a.service - ... Active: inactive (dead)Version:systemd 195
guettli
2
Globbing est disponible à partir de systemd 209: lists.freedesktop.org/archives/systemd-devel/2014-F February
Si vous avez beaucoup de services à redémarrer, la boucle while de la réponse de guettli fonctionnera mieux, car le caractère générique semble essayer de tous les redémarrer en même temps. Testé avec ~ 1000 services php-fpm, la charge est montée à 400 et j'ai dû redémarrer le serveur.
boutch55555
1
Fonctionne si les processus sont déjà en cours d'exécution, mais pas s'ils doivent être démarrés pour la première fois après avoir été activés. Mais vous pouvez utiliser systemctl restart autossh@{1..2}(avec n'importe quel N au lieu de 2) ce qui est un peu moins général mais cela démarrera également les processus s'ils le sont inactive (dead).
giorgiosironi
7

Pas sympa, mais cela fonctionne pour les systèmes avec un ancien systemd:

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done

Bien sûr, la solution de la réponse ci-dessus ( systemctl restart 'autossh@*') est meilleure.

guettli
la source
Attention: cutpeut analyser le mauvais champ en cas d'échec des services dans la sortie des unités de liste.
Juuso Ohtonen
5

@weirdan La réponse est correcte, mais il manque quelque chose pour certaines distributions.

Pour Centos 7 et similaires , vous pouvez faire:

systemctl (start|stop|restart|status) my-service@*

MAIS, (début) ne fonctionnera QUE si vous spécifiez le drapeau "--all":

systemctl (start) my-service@* --all

Sinon, il ne trouvera pas les services, car ils n'existent pas. Il s'agit de la fonctionnalité prévue par systemd.

Pour les systèmes basés sur Ubuntu , cela fonctionne à peu près de la même manière, mais la différence est que l'indicateur "--all" doit être spécifié pour tous les arguments systemctl, sinon il ne fera rien.

systemctl (start|stop|restart|status) 'my-service@*' --all
ku4eto
la source
2

Je ne sais pas si c'est là une option pour un caractère générique sur le terminal pour systemd. Ce que vous pouvez faire, c'est en ajouter un sur vos scripts systemd.

Le% i ferait l'affaire, je pense, mais est lié à la façon dont vous avez écrit les services instanciés.

Vous pouvez trouver une explication ici appelée spécificateurs

ce qui montre que:

% n

nom complet de l'unité

% p

Pour les unités instanciées, cela fait référence à la chaîne précédant le caractère "@" du nom de l'unité. Pour les unités non instanciées, cela fait référence au nom de l'unité dont le suffixe de type a été supprimé.

%je

Pour les unités instanciées: il s'agit de la chaîne entre le caractère "@" et le suffixe du nom de l'unité. Nom de l'unité

Je ne réponds pas directement à votre question, mais pour ce que je suppose que vous essayez de réaliser. Si vous pensez que votre solution peut être trouvée suite à cette idée, veuillez partager votre script systemd, afin que nous puissions éventuellement illustrer avec des exemples et peut-être même vous fournir le script final.

Si vous avez confiance en l'édition de votre propre script pour parvenir à une solution de cette façon, voici un exemple (je ne le citerai pas car je ne sais pas s'il est pertinent pour la solution et trop spécifique à ce que je '' je propose)

ignivs
la source