UnitファイルにおけるEnvironmentとEnvironmentFileの挙動

# はじめに
半分、備忘録的な書き方をしているため、記事を通して全体的に適当感があるかもしれませんが、ご愛嬌ください。
記事を書くきっかけとなったのは、ProftpdのソースインストールされたUnitファイルに、環境変数を読み込む設定が2つあったため、気になり調べてみました。

# ソースインストールしたときに作成される？Unitファイル
※`make install`した際に`proftpd.service`が作成されるのか、元々用意されているのか不明なため、↑のような表現をしています。
下記がproftpdのUnitファイルですが、`Environment`と`EnvironmentFile`の2つがあることがわかりますね。
```
# cat /usr/local/src/proftpd-1.3.7c/contrib/dist/rpm/proftpd.service
[Unit]
Description = ProFTPD FTP Server
Wants=network-online.target
After=network-online.target nss-lookup.target local-fs.target remote-fs.target

[Service]
Type = simple
Environment = PROFTPD_OPTIONS=
EnvironmentFile = -/etc/sysconfig/proftpd
ExecStartPre = /usr/sbin/proftpd --configtest
ExecStart = /usr/sbin/proftpd --nodaemon $PROFTPD_OPTIONS
ExecReload = /bin/kill -HUP $MAINPID
PIDFile = /run/proftpd/proftpd.pid

[Install]
WantedBy = multi-user.target
```
頭の良い人なら、ここで`man systemd.exec`して、パパッと理解するかもしれませんが、僕はそんなことないので、挙動を確認するためにUnitファイルを作っていこうと思います、、、、。

# 実際に確認していくよ
## 環境変数を何も指定しない場合
はじめに下記をコピペしてください。
```
cat <<"EOF" > /etc/systemd/system/my-test.service
[Unit]
Description=my-test

[Service]
Environment = OPTIONS=
EnvironmentFile = -/etc/sysconfig/mytest
ExecStart=/bin/echo $OPTIONS
EOF
```

サービスを起動してみると、`OPTIONS`には何も入っていないため、表示されないですね。
```
# systemctl start my-test.service
# journalctl -u my-test.service
 2月 27 00:54:53 tabi systemd[1]: /etc/systemd/system/my-test.service:1: Assignment outside of section. I>
 2月 27 00:54:53 tabi systemd[1]: Started my-test.service.
 2月 27 00:54:53 tabi systemd[1]: my-test.service: Succeeded.
```
# Environemtで環境変数を定義する場合
下記をコピペしてください。
```
cat <<"EOF" > /etc/systemd/system/my-test.service
[Unit]
Description=my-test

[Service]
Environment = OPTIONS=tabi
EnvironmentFile = -/etc/sysconfig/mytest
ExecStart=/bin/echo $OPTIONS
EOF
```
サービスを起動してみると、下記のように`Environemt`で定義した`tabi`が出力されています。
```
# systemctl start my-test.service
# journalctl -u my-test.service
 2月 27 01:04:49 tabi systemd[1]: Started my-test.
 2月 27 01:04:49 tabi echo[33607]: tabi
 2月 27 01:04:49 tabi systemd[1]: my-test.service: Succeeded
```

## EnvironmentFileで環境変数を定義する場合
下記をコピペしてください。
```
cat <<EOF > /etc/sysconfig/mytest
OPTIONS=sashiko
EOF
```
サービスを起動してみると、下記のように`EnvironmentFile`で定義した`sashiko`が出力されています。
```
# systemctl start my-test.service
# journalctl -u my-test.service
 2月 27 01:08:24 tabi systemd[1]: Started my-test.
 2月 27 01:08:24 tabi echo[33635]: sashiko
 2月 27 01:08:24 tabi systemd[1]: my-test.service: Succeeded.
```

## （おまけ）EnvironmentFileで環境変数の中身を定義しない場合
下記をコピペしてください。
```
cat <<EOF > /etc/sysconfig/mytest
OPTIONS=
EOF
```

サービスを起動してみると、何も表示されませんでした。
```
# systemctl start my-test.service
# journalctl -u my-test.service
 2月 27 01:13:22 tabi systemd[1]: Started my-test.
 2月 27 01:13:22 tabi systemd[1]: my-test.service: Succeeded.
```

# 結論
## ProftpdのUnitファイルでやっていること
`/etc/sysconfig/proftpd`に何も定義していなければ、下記のようなコマンドが実行されるみたいです。
- `/usr/sbin/proftpd --nodaemon`
```
# cat /usr/local/src/proftpd-1.3.7c/contrib/dist/rpm/proftpd.service
[Unit]
Description = ProFTPD FTP Server
Wants=network-online.target
After=network-online.target nss-lookup.target local-fs.target remote-fs.target

[Service]
Type = simple
Environment = PROFTPD_OPTIONS=
EnvironmentFile = -/etc/sysconfig/proftpd
ExecStartPre = /usr/sbin/proftpd --configtest
ExecStart = /usr/sbin/proftpd --nodaemon $PROFTPD_OPTIONS
ExecReload = /bin/kill -HUP $MAINPID
PIDFile = /run/proftpd/proftpd.pid

[Install]
WantedBy = multi-user.target
```

## わかったこと
環境変数を定義する場合、`Environment`よりも、`EnvironmentFile`のファイル内に定義した環境変数が読み込まれるらしいです。

ちなみに**筆者はどっちに環境変数を定義した方が良いかは分かっていない**ため、「自分はこうしているよ」みたいなのあれば、コメントしていただけると幸いです。
ここまでお読みいただき、ありがとうございました！