Systemd: перезапустить все экземпляры Сервиса сразу


17

Я использую замечательную функцию systemd: Instantiated Services.

Есть ли простой способ перезагрузить все созданные службы одним вызовом?

Пример: я не хочу запускать все так:

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

Я пробовал это, но это не работает

systemctl restart autossh@*

Связанный: запуск N процессов с одним файлом службы systemd

Обновить

Сначала я был очарован Instantiated Services, но позже я понял, что использование такого инструмента управления конфигурацией, как Ansible, имеет больше смысла. Я узнал: держите инструменты простыми. Многие инструменты начинают реализовывать проверку условий (если .. еще ...) и циклы. Например, настройка веб-серверов или почтовых серверов. Но это должно быть решено на другом (верхнем) уровне: управление конфигурацией. См: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

Ответы:


23

Systemd (начиная с systemd-209) поддерживает подстановочные знаки, однако ваша оболочка, вероятно, пытается их расширить. Используйте кавычки, чтобы передать групповые символы в команду systemctl / service дословно:

systemctl restart 'autossh@*'

У меня не работает: systemctl status 'autossh@*'output: autossh@\x2a.service - ... Active: inactive (dead)Version:systemd 195
guettli

2
Глобирование доступно начиная с systemd 209: lists.freedesktop.org/archives/systemd-devel/2014- Февраль/…
вирдан

Если вам нужно перезапустить много служб, цикл while в ответе Геттли будет работать лучше, так как подстановочный знак пытается перезапустить их все сразу. Протестировано с ~ 1000 php-fpm сервисов, нагрузка поднялась до 400, и мне пришлось перезагрузить сервер.
boutch55555

1
Работает, если процессы уже запущены, но не, если они должны быть запущены в первый раз после их включения. Но вы можете использовать systemctl restart autossh@{1..2}(с любым N вместо 2), который немного менее общий, но он также запустит процессы, если они есть inactive (dead).
giorgiosironi

7

Не хорошо, но это работает для систем со старым systemd:

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

Конечно, решение сверху ответ ( systemctl restart 'autossh@*') лучше.


Осторожно: cutможет разобрать неправильное поле в случае, если в выводе списка блоков есть сбойные службы.
Юусо Охтонен,

5

@weirdan Ответ правильный, но в некоторых дистрибутивах чего-то не хватает.

Для Centos 7 и аналогичных вы можете сделать:

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

НО, (запуск) будет работать ТОЛЬКО, если вы укажете флаг «--all»:

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

В противном случае он не найдет сервисы, так как они не существуют. Это системная функция.

Для систем на основе Ubuntu это работает примерно так же, но разница в том, что флаг «--all» должен быть указан для всех аргументов systemctl, иначе он ничего не будет делать.

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

2

Я не знаю, есть ли опция для подстановочного знака на терминале для systemd. То, что вы можете сделать, это добавить один из ваших сценариев systemd.

Думаю,% я бы сделал, но связан с тем, как вы создавали сценарии для экземпляров сервисов.

Вы можете найти объяснение здесь, упоминаемое как спецификаторы

что показывает, что:

% п

полное название устройства

%п

Для созданных экземпляров это относится к строке перед символом «@» в имени модуля. Для неинстанцированных модулей это относится к имени модуля с удаленным суффиксом типа.

Для созданных экземпляров модулей: это строка между символом "@" и суффиксом имени модуля. Unit name

Я не отвечаю прямо на ваш вопрос, но я думаю, что вы пытаетесь достичь. Если вы думаете, что ваше решение может быть найдено в соответствии с этой идеей, пожалуйста, поделитесь сценарием systemd, чтобы мы могли в конечном итоге проиллюстрировать его примерами и, возможно, даже предоставить вам окончательный сценарий.

Если вы уверены в редактировании свой собственный сценарий , чтобы достичь решения, кстати, здесь у вас есть пример (я не буду цитировать его , как я не знаю , если это имеет значение для решения, и слишком специфична , что я» я предлагаю)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.