systemd-サービスに複数の引数を与える


44

systemdサービスに複数の引数を与えることは可能ですか?

最終的なユーザーが決定する必要がある複数の引数を使用してプログラムを実行したいと思います。

例えば: ./program arg1 arg2

それを単一の引数アプリとして起動するsystemctl start arg1@programには、サービス定義のどこにあるのかが必要ですExecStart = /usr/bin/program ℅i

ありがとう!


1
あなたが望むのは設定ファイルのように聞こえます。
ダニエルB

外出先で変更する必要があります。confファイルは厳密に必要ですか?
ペペルーナ

@conferunas confファイルは必要ありません。追加のファイルなしで機能する私の答えを参照してください
-nonagon

回答:


34

はい、できます!それらをどこかのファイルで定義し、EnvironmentFilesystemdサービスに追加します。たとえば、/ etc / .progconfの内容は次のとおりです。

ARG1=-o
ARG2=--verbose

.serviceファイル:

EnvironmentFile=/etc/.progconf
ExecStart = /usr/bin/prog $ARG1 $ARG2

外出先で変更する必要がある場合は、そのファイルに書き込むことができます。サービスはそのオプションを頻繁に変更すべきではありません。それを達成する必要がある場合は、自動起動またはcronを検討してください。

その他の例については、https//wiki.archlinux.org/index.php/Systemd/Servicesを確認してください。


ほら、かなり便利で、それを考えていませんでした。ただし、同意する必要があります。サービスパラメータは定期的に変更されず、設定ファイルも変更されません。
ダニエルB

サービスファイルが環境変数を使用している場合、変数VAR1=... VAR2=... systemctl start foobar.serviceを渡すように言うことができますか?
ヨハネスシャウブ-litb

はい、できると信じています
platforma

6
@ JohannesSchaub-litb、いいえ、できません。PassEnvironmentディレクティブがありますが、systemdプロセスから変数を取得します(通常はPID 1)systemctlsystemctlプロセスからの環境変数は、開始されているサービスに伝播されません。
cjm

2
ただし、upstartは、異なるパラメーターを使用して、同じサービスの複数のインスタンスを実行できます。たとえば、eth0のメールサーバーとeth1の上記メールサーバーの別のインスタンスは、パラメーターをupstartに渡し、個別のサービスとして管理します。systemdはこれを実行できますか?
LtWorf

15

同じことをしたかったのですが、引数の組み合わせごとに個別のファイルはありませんでした。スペースを含む1つの長い引数を渡してから、systemdの環境変数のスペース分割機能を使用して引数を分離できることがわかりました。

ファイル名を使用してサービスを作成しましたargtest@.serviceサービスが引数を取るときに必要な末尾の「アットマーク」に注意してください)。

[Unit]
Description=Test passing multiple arguments

[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS

私はこれを実行sudo systemctl start argtest@"arg1 arg2 arg3".serviceし、それが通過しarg1arg2そしてarg3test.py.に別々のコマンドライン引数として


「末尾のアンパサンドに注意してください」:返信にアンパサンドが見つかりません。この点を明確にするために、返信を編集できますか?
パトリックメヴゼク

はい、ごめんなさい!
nonagon

@は、%Iを使用するときにのみ必要になると思います。これはサービスのインスタンスです。
トビー

同意して、私はそれを省いたいくつかのブログ投稿に出くわした。答えを明確にします。
-nonagon

これは別のサービス内からは機能しないようです。試しましたがWants=argtest@"arg1 arg2".service、最初の引数のみが渡されました。
ロジャーデュック

1

私が見つけた最も簡単なものは:

ExecStart=/bin/bash -c "\"/path/with spaces/to/app\" arg1 arg2 arg3 \"arg with space\""

それはすべて自己完結型に保ちます。

そうは言っても、少なくともUbuntu 18.04 LTSでは、その必要さえありません。これを行うことができ、正常に動作します。

ExecStart="/path/with spaces/to/app" arg1 arg2 arg3 "arg with space"

$vars このパターンでも引数として機能します。

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