Назад | Перейти на главную страницу

Systemd: перезапуск всех экземпляров созданной службы сразу

Я использую прекрасную возможность 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

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

systemctl restart 'autossh@*'

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

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

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

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

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

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

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

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

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

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

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

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

Я думаю, что% i сделал бы трюк, но он связан с тем, как вы создавали скрипты для созданных сервисов.

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

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

% n

полное название объекта

%п

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

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

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

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