引数にスペースを含むsystemdユニットがあります
ExecStart=command --argument="text text"
Systemdは二重引用符または単一引用符を認識せず、引数を2つの引数に分割するようです。どうすればそれを防ぐことができますか? CoreOS内でsystemd v218を使用しています。
残念ながら、これは実際には驚くほど困難です。この情報を this answer から盗みました。これを行う唯一の方法は、引数を環境ファイルに入れて、それを(/etc/.progconfigのように)変数として使用することです。
ARG1=text
ARG2=text
次に、コマンドを実行する前に環境ファイルをインポートします。
EnvironmentFile=/etc/.progconf
ExecStart = command $ARG1 $ARG2
systemdは、引数を完全に囲む引用符のみを認識しているようです。つまり.
ExecStart=command "--argument=text text"
動作しますが
ExecStart=command --argument="text text"
ではない。私はこの問題に遭遇し、それについて #624 を提出しました。
Nicoが提案したように、引数をスペースで指定できるEvironmentFileを作成できます。
SPACEYARG="i love spaces"
ただし、ユニットファイルでは、スペースを適切に渡すために、その引数を中括弧で囲む必要があります。
EnvironmentFile=/etc/.progconf
ExecStart = command ${SPACEYARG}
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
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"
環境はそれを行う方法です。
\s
をスペースとして使用することもできるため、ExecStartは次のようになります。
ExecStart=command --argument="text=\stext"
ref: https://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines