Systemd:インスタンス化されたサービスのすべてのインスタンスを一度に再起動します


17

systemdの素晴らしい機能であるInstantiated Servicesを使用しています。

インスタンス化されたすべてのサービスを1回の呼び出しでリロードする簡単な方法はありますか?

例:すべてをこのように実行したくありません:

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

私はこれを試しましたが、これは機能しません

systemctl restart autossh@*

関連:1つのsystemdサービスファイルでNプロセスを開始する

更新

最初はInstantiated Servicesに魅了されましたが、後でAnsibleのような構成管理ツールを実行する方が理にかなっていることに気付きました。私は学んだ:ツールをシンプルに保つ。多くのツールは、条件チェック(if .. else ...)とループの実装を開始します。たとえば、ウェブサーバーまたはメールサーバーの構成。ただし、これは別の(上位)レベルで解決する必要があります:構成管理。参照:https : //github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

回答:


23

systemd(systemd-209以降)はワイルドカードをサポートしていますが、シェルがワイルドカードを拡張しようとしている可能性があります。引用符を使用して、ワイルドカードをsystemctl / serviceコマンドにそのまま渡します。

systemctl restart 'autossh@*'

私には機能しません:systemctl status 'autossh@*'出力:autossh@\x2a.service - ... Active: inactive (dead)バージョン:systemd 195
guettli

2
:グロブはsystemdに209から開始可能ですlists.freedesktop.org/archives/systemd-devel/2014-February/...
weirdan

再起動するサービスがたくさんある場合は、ワイルドカードが一度にすべてのサービスを再起動しようとするため、guettliの答えの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リスト単位の出力に失敗したサービスがある場合、間違ったフィールドを解析する可能性があります。
Juuso Ohtonen

5

@weirdan回答は正しいですが、特定のディストリビューションでは何かが欠落しています。

以下のためにCentOSに7と同様の、あなたが行うことができます。

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

ただし、フラグ「--all」を指定すると、(開始)のみが機能します。

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

そうしないと、サービスが存在しないため、検索されません。これはsystemdが意図した機能です。

以下のためのUbuntuベースのシステムで、それはかなり同じように動作しますが、違いは、フラグが、それ以外の場合は何もしません、systemctlすべての引数を指定する必要があり、「--all」ということ、です。

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

2

systemdのターミナルにワイルドカードのオプションがあるかどうかはわかりません。できることは、systemdスクリプトに追加することです。

%iは私が思うトリックを実行しますが、インスタンス化されたサービスをスクリプト化する方法に関連しています。

ここに指定子と呼ばれる説明があります

それはそれを示しています:

%n

完全なユニット名

%p

インスタンス化されたユニットの場合、これはユニット名の「@」文字の前の文字列を指します。インスタンス化されていないユニットの場合、これはタイプサフィックスが削除されたユニットの名前を指します。

%私

インスタンス化されたユニットの場合:これは、「@」文字とユニット名の接尾辞の間の文字列です。ユニット名

私はあなたの質問に直接答えているわけではありませんが、あなたが達成しようとしていると思うことのために。このアイデアに従って解決策が見つかったと思われる場合は、systemdスクリプトを共有してください。

独自のスクリプトを編集してその方法でソリューションに到達する自信がある場合は、ここに例を示します(ソリューションに関連するかどうかはわかりません。 m提案)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.