私のsystemdサービスに複数の引数を与えることは可能ですか?
最終ユーザーが決定しなければならない複数の引数を使用してプログラムを実行したいのですが。
例:./program arg1 arg2
それを単一の引数のアプリから始めるには、systemctl start arg1@program
のようなものが必要です。サービス定義ではExecStart = /usr/bin/program ℅i
があります。
ありがとうございます。
はい、できます!それらをどこかのファイルに定義して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
私は同じことをしたかったが、引数の組み合わせごとに別々のファイルを使わなかった。 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
で実行し、arg1
、arg2
およびarg3
を別々のコマンドライン引数としてtest.pyに渡します。
私が見つけた最も簡単なものは:
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
もこのパターンの引数として機能します。