1. ホーム
  2. linux

複数のexecStartを持つSystemd [終了しました]。

2023-09-07 08:36:14

質問

同じスクリプトを異なる入力パラメータで開始するサービスを作成することが可能かどうか知りたいです。 例えば、次のようなものです。

[Unit]
Description=script description

[Service]
Type=simple
ExecStart=/script.py parameters1
ExecStart=/script.py parameters2
Restart=on-failure

[Install]
WantedBy=multi-user.target

ということは、シリアルモードで起動するのでしょうか? それとも2つのプロセスに分けるのでしょうか?

どのように解決するのですか?

もし Type=simple を指定した場合、ExecStartは1つしか指定できませんが、ユニットファイルにはいくつでも ExecStartPre , ExecStartPost しかし、これらは連続的に実行され、一回起動したものはすべて次のコマンドを起動する前に kill されるため、長時間実行するコマンドには適していません。

もし Type=oneshot の場合、複数の ExecStart を指定しても、それらは並列ではなく、連続的に実行されます。

複数のユニットを並列に実行したい場合、いくつかできることがあります。

1つのパラメータで異なる場合

テンプレートユニットを使用することができますので、テンプレートユニットを作成する際に /etc/systemd/system/[email protected] . ノート (その @ が重要)。

[Unit]
Description=script description %I

[Service]
Type=simple
ExecStart=/script.py %i
Restart=on-failure

[Install]
WantedBy=multi-user.target

そして、実行する。

$ systemctl start [email protected] [email protected]

または...

対象の依存関係

1つのターゲットにリンクするユニットを複数作成することができます。

#/etc/systemd/system/bar.target
[Unit]
Description=bar target
Requires=multi-user.target
After=multi-user.target
AllowIsolate=yes

そして、.serviceユニットを以下のように変更します。 WantedBy=bar.target のようにします。

#/etc/systemd/system/[email protected]
[Unit]
Description=script description %I

[Service]
Type=simple
ExecStart=/script.py %i
Restart=on-failure

[Install]
WantedBy=bar.target

そして、並行して必要なfooサービスを有効にし、barターゲットをこのように起動するだけです。

$ systemctl daemon-reload
$ systemctl enable [email protected]
$ systemctl enable [email protected]
$ systemctl start bar.target

注意 これはテンプレートユニットだけでなく、あらゆるタイプのユニットで動作すること。