systemd の Environment / EnvironmentFile では変数展開できません

  • 8
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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)"

というように、 ExecStartPresystemctlset-environment を利用することで、
ExecStart で利用することができます。

参考

http://superuser.com/questions/968561/how-to-get-the-machine-ip-address-in-a-systemd-service-file