web-dev-qa-db-ja.com

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

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

最終ユーザーが決定しなければならない複数の引数を使用してプログラムを実行したいのですが。

例:./program arg1 arg2

それを単一の引数のアプリから始めるには、systemctl start arg1@programのようなものが必要です。サービス定義ではExecStart = /usr/bin/program ℅iがあります。

ありがとうございます。

43
peperunas

はい、できます!それらをどこかのファイルに定義してsystemdサービスのEnvironmentFileに追加してください。たとえば、/ 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

30
platforma

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

[email protected]というファイル名でサービスを作成しました(最後の 'at sign'は、サービスが引数を取るときに必要です)。

[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およびarg3を別々のコマンドライン引数としてtest.pyに渡します。

13
nonagon

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

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もこのパターンの引数として機能します。

1
jjxtra