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

これで環境変数が正しく読み込まれるようになった。

参考


Related #raspberry pi

ngrokの代わりにCloudflare Tunnelを使う

botやwebhookを利用するサービスの開発が捗る

Dockerのデータ保存場所を変更する

/etc/docker/daemon.jsonに追記

Alexaにゲーミングマシンと周辺環境を終了してもらう

「Alexa Steamを終了して」ができるようになった

Alexaにゲーミングマシンと周辺環境を起動してもらう

PC起動、TV起動、サウンドバー起動がまとめてできるようになった

docker-compose build時に「no Space Left on Device」が発生

1年前にも同じエラーにハマってた