systemd での Environment
/ EnvironmentFile
では変数展開できません。
知らずにハマったので記事に残します。
現象
例えば、
/etc/systemd/system/sample.service
[Unit]
Description=Sample
[Service]
EnvironmentFile=/etc/default/sample
ExecStart=/bin/echo $VAR2
というようなサービスがあり、
/etc/default/sample
VAR1=word1
VAR2=$VAR1 word2
となっていた場合に表示されるのは、
$VAR1 word2
になります。
word1 word2
ではありません。
manページ では以下のように説明されています。
変数展開は文字列の中では実行されません。ただし、指定子展開は可能です。 $ という文字は特別な意味を持ちません。
対応方法
VAR1=word1
VAR2=word1 word2
のように自ら変数展開して記述する必要があります。
コマンドの実行結果を変数として使いたい場合
コマンドの実行結果を変数として使いたい場合に
VAR=$(command)
と記載しても
$(command)
と、そのまま出力されるだけです。
また、 ExecStart
の中で
ExecStart=/bin/echo $(command)
と書いても同様です。
この場合の対応方法としては、
ExecStartPre=/bin/sh -c "/bin/systemctl set-environment VAR=$(command)"
というように、 ExecStartPre
で systemctl
の set-environment
を利用することで、
ExecStart
で利用することができます。
参考