systemdで環境変数を使う
先日、AWS IoTへのデータ送信スクリプトをsystemdで自動起動するようにしたが寝室だけでなく、リビングにもBME280センサーを導入することにした。
その際にコードを使い回せるように.bashrcにcertファイルのPATH等を環境変数で取得できるようにしたが、systemdで起動すると環境変数が読み込まれずにハマったので対応方法を残しておく。
環境変数の設定方法はいくつかあるが、今回は環境変数をまとめたファイルを用意して、serviceファイル内で[[EnvironmentFile]]に指定する方法を使うことにした。
設定方法
- 起動コマンドのスクリプトを環境変数を使うように修正
#!/bin/sh
python myBasicPubSub.py \
--endpoint ${AWS_IOT_ENDPOINT} \
--rootCA ${AWS_IOT_ROOT_CA} \
--cert ${AWS_IOT_CERT} \
--key ${AWS_IOT_KEY} \
-t ${AWS_IOT_PUBSUB_TAG}
- /etc/sysconfig/rootを作成し、環境変数情報を記述
# /etc/sysconfig/root
AWS_IOT_ENDPOINT=id.iot.ap-northeast-1.amazonaws.com
AWS_IOT_ROOT_CA=/path/rootCA1.pem
AWS_IOT_CERT=/path/certificate.pem.crt
AWS_IOT_KEY=/path/private.pem.key
AWS_IOT_PUBSUB_TAG=piz/bme280
- service設定ファイルにEnvironmentFileを追記
# /etc/systemd/system/awsiot.service
[Unit]
Description = awsiot bme280
[Service]
WorkingDirectory=/home/pi/bme280/
ExecStart=/home/pi/bme280/script.sh
Type=fork
Restart=always
EnvironmentFile=/etc/sysconfig/root # 環境変数ファイルを指定
[Install]
WantedBy=multi-user.target
- サービス再読み込み
sudo systemctl daemon-reload
- サービス再起動
sudo systemctl restart awsiot.service
これで環境変数が正しく読み込まれるようになった。