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

linux systemd

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

最終的にユーザーが決めなければならない複数の引数を持つプログラムを実行したいと思います

./program arg1 arg2

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

Thanks!

  54  peperunas  2014-03-14


ベストアンサー

はい、できます。どこかのファイルで定義して、systemd Service の EnvironmentFile に追加してください。例えば、/etc/.progconf の内容が以下のようになっているとします

ARG1=-o
ARG2=--verbose

.サービスファイルも

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

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

より多くの例については、チェックしてください。https://wiki.archlinux.org/index.php/Systemd/Services

45  alexm  2014-03-14


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

ファイル名が argtest@.service のサービスを作ってみました (サービスが引数を取るときに必要な最後の ‘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に渡します

25  nonagon  2018-01-03


私が見つけた中で一番簡単なのは

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はこのパターンでも引数として動作します

2  jjxtra  2019-08-15


systemctledit オプションを使ってドロップインスニペットを作成し、サービスをオーバーライドするようにユーザーに伝えます

まず、いくつかのまともなデフォルトから始めましょう。サービスのExecStart部分が以下のように宣言しているとします

[Service]
ExecStart=./program arg1

これで、このサービスのユーザは誰でも、プログラムを実行するために異なる引数のセットを使用することができるようになりました。これはドロップインスニペットを作成することで実現できます

systemctl edit myservice.service

新しいファイルでは、ExecStartを上書きするために以下のように書くだけだそうです

[Service]
ExecStart=
ExecStart=./program arg1 arg2

この方法の利点は、パッケージマネージャによっては競合する可能性のあるシステムにインストールされたサービスを変更する必要がないことです

そして、それはそれ!

あとは、systemd (systemctl daemon-reload) をリロードして、サービス (systemctl restart myservice.service) を再起動するだけです

サービスの再起動時には、必ずユーザーの修正内容も読み込まれます

お役に立てれば幸いです


Sources:

0  smac89  2020-03-21


タイトルとURLをコピーしました