web-dev-qa-db-ja.com

複数のexecStartを持つSystemd

i異なる入力パラメーターで開始された同じスクリプトでサービスを作成できるかどうかを知ります。といった:

[Unit]
Description=script description

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

[Install]
WantedBy=multi-user.target

出来ますか?その後、シリアルモードで起動しますか?または2つの異なるプロセスに?宜しくお願いします

31
Riccardo

ユニットファイルでType=simpleの場合、1つのExecStartしか指定できませんが、ExecStartPre,ExecStartPost`を追加できますが、これらはシリアルで実行されるため、長時間実行するコマンドには適していません。 startは、次のものを開始する前に強制終了されます。

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]

または...

ターゲットの依存関係

単一のターゲットにリンクする複数のユニットを作成できます。

#/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

注:これは、テンプレートユニットだけでなく、あらゆるタイプのユニットで機能します。

47
aleivag

スクリプトの1つにExecStartPreまたはExecStartPostを使用できます

[Unit]
Description=script description

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

[Install]
WantedBy=multi-user.target
9
amin khozaei