web-dev-qa-db-ja.com

systemdコマンドライン引数でスペースを使用するにはどうすればよいですか?

引数にスペースを含むsystemdユニットがあります

ExecStart=command --argument="text text"

Systemdは二重引用符または単一引用符を認識せず、引数を2つの引数に分割するようです。どうすればそれを防ぐことができますか? CoreOS内でsystemd v218を使用しています。

15
Wolfgang

残念ながら、これは実際には驚くほど困難です。この情報を this answer から盗みました。これを行う唯一の方法は、引数を環境ファイルに入れて、それを(/etc/.progconfigのように)変数として使用することです。

ARG1=text
ARG2=text

次に、コマンドを実行する前に環境ファイルをインポートします。

EnvironmentFile=/etc/.progconf
ExecStart = command $ARG1 $ARG2
12
nico

systemdは、引数を完全に囲む引用符のみを認識しているようです。つまり.

ExecStart=command "--argument=text text"

動作しますが

ExecStart=command --argument="text text"

ではない。私はこの問題に遭遇し、それについて #624 を提出しました。

15
Tgr

Nicoが提案したように、引数をスペースで指定できるEvironmentFileを作成できます。

SPACEYARG="i love spaces"

ただし、ユニットファイルでは、スペースを適切に渡すために、その引数を中括弧で囲む必要があります。

EnvironmentFile=/etc/.progconf
ExecStart = command ${SPACEYARG}
3
Niki

Systemdの最近のバージョンでは、bashが受け入れるものに近い、引数の途中で引用符を受け入れ始めていると思います。ただし、@ Tgrの答えは正しいので、詳しく説明する価値があります。フラグ名を含む引数全体を引用すると、ここで機能します。これを行う場合:

ExecStart=command "--argument=text text"

その後、systemdは--argument=text textを単一の位置引数として理解します。そのスペースでこれ以上分割が発生することを心配する必要はありません。あなたはbashで同じ動作を見ることができます:

$ echo "--silly-flag=spaces     are    preserved here"
--silly-flag=spaces     are    preserved here
2
Jack O'Connor

Systemdサービスファイルはこれをサポートしています

Environment="TEST=one Word"
Environment="TEST2=second Word"

ExecStartPre=-/bin/echo start pre
ExecStartPre=/bin/echo start pre mandatory
ExecStart=/bin/echo started : ${TEST} $TEST2
ExecStartPost=-/bin/echo start post
ExecStartPost=/bin/echo start post mandatory
ExecStop=/bin/echo stop
ExecStopPost=-/bin/echo stop post
ExecStopPost=/bin/echo stop post mandatory
ExecReload=/bin/echo reload

ログ:

Mar 09 21:39:47 gitlab-runner-1 echo[30286]: start pre
Mar 09 21:39:47 gitlab-runner-1 echo[30288]: start pre mandatory
Mar 09 21:39:47 gitlab-runner-1 echo[30295]: started : one Word second Word
Mar 09 21:39:47 gitlab-runner-1 echo[30296]: start post
Mar 09 21:39:47 gitlab-runner-1 echo[30297]: start post mandatory
Mar 09 21:39:47 gitlab-runner-1 echo[30298]: stop
Mar 09 21:39:47 gitlab-runner-1 echo[30299]: stop post
Mar 09 21:39:47 gitlab-runner-1 echo[30300]: stop post mandatory

ただし、アプリが文字列全体を2つの引数として読み取る必要がある場合は、実際にはこれを設定する必要があります。各引数は ""の間(テストされていません)

ExecStart=command "$ARG1" "$ARG2"
1
Radu Toader

環境はそれを行う方法です。

\sをスペースとして使用することもできるため、ExecStartは次のようになります。

ExecStart=command --argument="text=\stext"

ref: https://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines

1
panduora