ゆるエンジニアはいろいろ遊びたい

FAエンジニアが週末にいろいろ遊ぶブログです

RaspberryPi5 systemdを使ってプログラムをタイマーでON/OFFした

前回ラズパイでホームサーバーを構築して常時起動するようにしましたが、OLEDディスプレイにCPU情報を表示するプログラムを常駐させていると夜に眩しくて寝れないという事に気づきました。
slowtech.hateblo.jp
slowtech.hateblo.jp
今回はこれを1日のうち指定した時間だけ実行するようにしました。
プログラムをスケジュールで動かすためにはsystemdで制御します。

起動用タイマーを設定してサービスファイルを呼び出す
sudo nano /etc/systemd/system/cpu_oled_on.timer
[Unit]
Description=Start CPU OLED at 6:00

[Timer]
OnCalendar=*-*-* 06:00:00
Persistent=true

[Install]
WantedBy=timers.target

ここまでがタイマーの作成、以下がサービスの作成

sudo nano /etc/systemd/system/cpu_oled_on.service
[Unit]
Description=Start CPU OLED Service

[Service]
Type=oneshot
ExecStart=/bin/systemctl start cpu_oled.service

停止用のタイマーも同様に作ります。

sudo nano /etc/systemd/system/cpu_oled_off.timer
[Unit]
Description=Stop CPU OLED at 21:00

[Timer]
OnCalendar=*-*-* 21:00:00
Persistent=true

[Install]
WantedBy=timers.target

ここまでがタイマー、以下がサービス

sudo nano /etc/systemd/system/cpu_oled_off.service
[Unit]
Description=Stop CPU OLED Service

[Service]
Type=oneshot
ExecStart=/bin/systemctl stop cpu_oled.service

有効化します。

sudo systemctl daemon-reload
sudo systemctl enable cpu_oled_on.timer
sudo systemctl enable cpu_oled_off.timer
sudo systemctl start cpu_oled_on.timer
sudo systemctl start cpu_oled_off.timer

これで設定は完了。確認は以下のコマンドです。

systemctl list-timers

実行すると以下のような結果がでました。

NEXT                            LEFT LAST                              PASSED UNIT                         ACTIVATES                     
Sun 2025-12-14 21:00:00 JST      12h -                                      - cpu_oled_off.timer           cpu_oled_off.service
Mon 2025-12-15 06:00:00 JST      21h -                                      - cpu_oled_on.timer            cpu_oled_on.service

ちゃんと21:00と6:00に設定したタイマーが予定に組み込まれてますね。

プログラムをタイマーで動作させるには、cronというものがあるらしいですが、ChatGPTはcronは古くて今回の使い方には合わないからtimerを使えと言ってきました。
cronは管理面、ログ面、起動停止などの柔軟性に欠けるらしいです。
.serviceファイルの、ExecStart=サービス名は複数個設定しても動作するらしいので、他のサービスも1つのタイマーで制御できるのは便利ですね。