Я использую прекрасную возможность 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, чтобы мы могли в конечном итоге проиллюстрировать его примерами и, возможно, даже предоставить вам окончательный сценарий.
Если вы уверены, что редактируете собственный сценарий, чтобы найти решение таким образом, Вот у вас есть пример (я не буду его цитировать, так как не знаю, актуален ли он для решения и слишком ли конкретен для того, что я предлагаю)