Systemd: перезавантажте всі екземпляри миттєвої служби одразу


17

Я використовую приємну особливість systemd: Миттєві послуги.

Чи є простий спосіб перезавантажити всі створені послуги одним викликом?

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

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

Я спробував це, але це не працює

systemctl restart autossh@*

Пов'язане: Запустіть N процесів з одним системним файлом обслуговування

Оновлення

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

Відповіді:


23

Systemd (починаючи з systemd-209) підтримує символи, але ваша оболонка, ймовірно, намагається розширити їх. Використовуйте лапки, щоб передати символи символів до команди systemctl / service verbatim:

systemctl restart 'autossh@*'

Не працює для мене: systemctl status 'autossh@*'вихід: autossh@\x2a.service - ... Active: inactive (dead)Версія:systemd 195
guettli

2
Глоббінг доступний починаючи з systemd 209: list.freedesktop.org/archives/systemd-devel/2014-February/…
weirdan

Якщо у вас є багато служб для перезавантаження, цикл while у відповіді guettli буде працювати краще, оскільки макіяж, схоже, намагається перезапустити їх усі відразу. Перевірений на ~ 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може проаналізувати неправильне поле у ​​випадку виходу з ладу служб у виведенні одиниць списку.
Juuso Ohtonen

5

@weirdan Відповідь правильна, але у певних дистрибутивах щось не вистачає.

Для Centos 7 та подібних ви можете:

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

Але, (start) буде працювати ТІЛЬКИ, якщо ви вказали прапор "--all":

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

В іншому випадку він не знайде послуг, оскільки їх не існує. Це системно призначена функція.

Для систем на базі Ubuntu він працює майже однаково, але різниця полягає в тому, що прапор "--all" повинен бути вказаний для всіх аргументів systemctl, інакше він нічого не зробить.

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

2

Я не знаю, чи є тут варіант для підстановки на терміналі для systemd. Що ви можете зробити, це додати його до системних сценаріїв.

%, Я б зробив трюк, я думаю, але це пов'язано з тим, як ви написали сервіси, що розробляються.

Ви можете знайти пояснення тут , вказані як специфікатори

що показує, що:

% n

повна назва одиниці

% p

Для ідентифікованих одиниць це посилається на рядок перед символом "@" імені одиниці. Для неінтензованих одиниць це стосується назви одиниці із видаленим суфіксом типу.

% i

Для оригінальних одиниць: це рядок між символом "@" та суфіксом одиниці name.unit

Я не відповідаю безпосередньо на ваше запитання, але для того, що я думаю, ви намагаєтесь досягти. Якщо ви думаєте, що ваше рішення може бути знайдене за цією ідеєю, будь ласка, поділіться своїм системним сценарієм, тому ми можемо в кінцевому підсумку проілюструвати приклади і, можливо, навіть надати вам остаточний сценарій.

Якщо ви впевнені в редагуванні власного сценарію, щоб таким чином досягти рішення, ось у вас є приклад (я не навожу його, оскільки я не знаю, чи він стосується рішення, і занадто конкретний для того, що я ' м пропоную)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.