systemdExecStartのエスケープ文字が失敗する
Oct 16 2020
jenkinsサーバーのjnlp構成ファイルから値を抽出するための次のスニペットがあります。ターミナルの箱から出して動作しますが、ユニットとしては動作しません。値をどこかに置いて環境変数として使用できるように、単位が必要です。ただし、エスケープシーケンスエラーが発生し続けます。私が見つかりました。この私が唯一の引用符とスラッシュを心配する必要が示唆しているが、私は同じ結果を得ます。ここでExecStartsedを含めると、ファイルのは:
ExecStart=/bin/sh -c 'curl -L -s -X GET http://10.x.x.x:8080/computer/name-of-executor/slave-agent.jnlp | sed \"s/.*<application-desc main-class=\"hudson.remoting.jnlp.Main\"><argument>\([a-z0-9]*\).*/\1/\" >> /etc/build_environment'
私はエスケープ文字の多くの組み合わせを試しましたが無駄になりました。さらに、同じパターンを使用してメタデータから値を抽出し(curl、pippingなどを使用)、それは正常に機能します。ここで何が起こっているのか間違いなく混乱しています
回答
1 meuh Oct 16 2020 at 18:53
これをデバッグするための簡単な方法は、オプションを追加することです-vしsh -c、実際にそれを渡しているsystemdにものを見るために。これを行うと、(読みやすさのために)取得していることがわかります。
curl ... | sed "s/... main-class="hudson...">.../\1/" >>...
構文エラーは、sedに与えられた二重引用符で囲まれたコマンド"が\"。の代わりにその中にあることです。これは、systemdが文字列内で無差別に置換\"されるためです。"ExecStart
(systemdはに縮小されます)shを使用してバックスラッシュを渡す必要があり、次に二重引用符を使用します。\\\
ExecStart=/bin/sh -cv 'curl... | sed "s/...main-class=\\"hudson...