はじめに
前回までで無事にRaspberry Piに搭載したセンサからデータを取得し、サーバへのリクエストに対してブラウザで表示することができたわけだが、運用している中でちょっとした問題につまづいたため解決策を書き残しておく。
問題点
sshが長時間操作していない、もしくはターミナルで接続しているパソコンをスリープ状態にするなどで接続が切れてしまい、切れるタイミングでそこで行っているメインプロセスが閉じられてしまうということだった。前回までは、ssh接続を行いそこでメインプロセスとしてセンサでのデータ取得と送信プログラムを走らせていた。
解決策
- screenでバックグラウンドでプロセスを起動してsshを閉じても処理が続くようにする。
- ユニットファイルを作成し、該当プログラムをデーモン化する。
選定について
今回問題を解決するにあたって、考慮する点は「ssh接続を切った後にも処理が続くか」、「いかに簡単にそのプログラムの動作状況が確認できるか」ということなので「ユニットファイルを作成し、該当プログラムをデーモン化する」方法で今回の問題を解決したいと思う。
概要
ラズパイで起動しているInsertInfo.pyを自動起動、永続起動にするために、systemdを使ってサービス化(デーモン化)する。
実装するにあたって
- Linux上のPythonのPath
/usr/bin/python3
- InsertInfo.pyのPath
/home/pi/CmftCon/InsertInfo.py
実装
serviceファイルの作成
/etc/systemd/system配下にserviceファイルを作成する。
/etc/systemd/system $ sudo vi ComfortInsert.service
[Unit]
Description=Insert Comfort data
After=multi-user.target
[Service]
ExecStart=/usr/bin/python3 InsertInfo.py
WorkingDirectory=/home/pi/CmftCon
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
- Description:デーモンの名前を決める。
- After:このデーモンがどのプロセスの起動後に起動するか指定する。
- ExecStart:実行コマンドを記述する。
- WorkingDirectory:どこのディレクトリから実行コマンドを打つかの指定する。
- ExecStartとWorkingDirectoryをターミナルでやるとこんな感じになる。
/home/pi/CmftCon $ /usr/bin/python3 InsertInfo.py
- Restart:プロセスが死んだ時の再起動指定をする。
-
always
で死んだら毎回再起動する。
-
- User:実行時のユーザを指定する。
- WantedBy:enable設定時にどこにリンクを作成するか指定する。
-
multi-user.target
に指定しているためenable設定を行うとmulti-user.target.wants
ディレクトリの中にこの設定へのシンボリックリンクが貼られる。
-
権限設定
現在の権限を確認する。
/etc/systemd/system $ ls -al
total 84
drwxr-xr-x 20 root root 4096 Oct 18 23:37 .
drwxr-xr-x 5 root root 4096 Feb 21 2023 ..
-rw-r--r-- 1 root root 211 Oct 18 23:37 ComfortInsert.service
# 中略
drwxr-xr-x 2 root root 4096 Apr 21 16:02 multi-user.target.wants
ちゃんとできてはいるが、、実行権限がないのでchmod
で権限を付与する。
/etc/systemd/system $ sudo chmod 755 ComfortInsert.service
権限を再度確認する。
/etc/systemd/system $ ls -al
total 84
drwxr-xr-x 20 root root 4096 Oct 18 23:37 .
drwxr-xr-x 5 root root 4096 Feb 21 2023 ..
-rwxr-xr-x 1 root root 211 Oct 18 23:37 ComfortInsert.service
# 中略
drwxr-xr-x 2 root root 4096 Apr 21 16:02 multi-user.target.wants
実行権限が渡されていることが確認できたので、デーモンの情報を再読み込みし、反映させる。
$ sudo systemctl daemon-reload
反映されたかのチェックとステータスの確認を行う。
$ sudo systemctl status ComfortInsert.service
● ComfortInsert.service - Insert Comfort data
Loaded: loaded (/etc/systemd/system/ComfortInsert.service; disabled; vendor preset: enabled)
Active: inactive (dead)
起動
反映されていることが確認できた。
起動&ステータスのチェックをする。
$ sudo systemctl start ComfortInsert.service
$ sudo systemctl status ComfortInsert.service
● ComfortInsert.service - Insert Comfort data
Loaded: loaded (/etc/systemd/system/ComfortInsert.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2023-10-18 23:41:11 JST; 13s ago
Main PID: 8165 (python3)
Tasks: 1 (limit: 8755)
CPU: 194ms
CGroup: /system.slice/ComfortInsert.service
└─8165 /usr/bin/python3 InsertInfo.py
無事に動いていることが確認できた。
まだここでは自動起動設定をしてないため、/etc/systemd/system/ComfortInsert.service; disabled
になっている。
自動起動設定とステータス確認、リンクがあるかどうかのチェック
自動起動設定
$ sudo systemctl enable ComfortInsert.service
Created symlink /etc/systemd/system/multi-user.target.wants/
これで自動起動設定がされてリンクが作成されたはず。
ステータスの確認
$ sudo systemctl status ComfortInsert.service
● ComfortInsert.service - Insert Comfort data
Loaded: loaded (/etc/systemd/system/ComfortInsert.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-10-18 23:41:11 JST; 44s ago
Main PID: 8165 (python3)
Tasks: 1 (limit: 8755)
CPU: 199ms
CGroup: /system.slice/ComfortInsert.service
└─8165 /usr/bin/python3 InsertInfo.py
自動起動設定がされたため、/etc/systemd/system/ComfortInsert.service; enabled
に変わっている。
リンクがあるのかどうか確認する
/etc/systemd/system/multi-user.target.wants $ ls | grep ComfortInsert.
service
ComfortInsert.service
リンクがあることを確認できた。
今回はここまで!!
第1弾(Spring編)はこちら
第2弾(RasPi編)はこちら
第3弾(AWS編)はこちら