systemd を使用する方法

最近は cron ではなく、systemd を使うのが一般的なようです

私も最近は systemd を使っていますので、それを紹介します

環境

  • ラズパイ 3B+
  • ubuntu 20.04.4 LTS

timezone 設定

時間がずれては困るのでtimezoneを設定します

日本ですので asia/tokyo にします

https://www.server-world.info/query?os=Ubuntu_20.04&p=timezone

.service と .timer の2つを作成

毎日AM3時に定期再起動するようにします

.service と .timer の2つのファイルを/etc/systemd/system/につくります

/lib以下に作ることもありますが、今回は/etc以下としています
/etc以下がお作法のようです

こちらの記事(↓)でも/etc以下としています https://qiita.com/mogya/items/aaee50d41012d202f53c


service,timer ともに同じ名前で、saikidou.service,saikidou.timer としています

https://rcmdnk.com/blog/2020/10/12/computer-raspberrypi-linux/

別のserviceを呼び出したければ Unit = yourjob.serviceを書きます

デフォルトは同じ名前のserviceが呼び出されるので記載不要です(なので今回は記載していません)


sudo nano /etc/systemd/system/saikidou.service

saikidou.service の中身↓

[Unit]
Description = scheduled saikidou 1times per day at 3am

[Service]
Type = simple
ExecStart=/usr/bin/systemctl --force reboot

[Install]
WantedBy = multi-user.target

Description = XXXXの XXXX は好きな文字列でOKです


sudo nano /etc/systemd/system/saikidou.timer

saikidou.timer の中身↓

[Unit]
Description = scheduled saikidou 1times per day at 3am

[Timer]
OnCalendar = *-*-* 03:00:00
AccuracySec = 1m

[Install]
WantedBy = timers.target

OnCalendar = *-*-* 03:00:00年-月-日 時:分:秒 の順となっている

*-*-* 03:00:00 であれば、年、月、日は未指定になるため、毎日AM3時に実行となる

AccuracySec = 1mはだいたいAM3時0分0秒の1分以内くらいに実行されますよということ

起動時に自動起動

sudo systemctl enable saikidou.timer

enable(自動起動)はsaikidou.timerだけで良いです

saikidou.serviceのenableは不要です

スタート(有効化)

sudo systemctl start saikidou.timer

変更を反映

sudo systemctl daemon-reload

登録の確認

sudo systemctl list-units

どのサービスを登録している(enableしているか)か確認できる

.service .timerなど拡張子別にたくさん表示される

https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units-ja

systemdが把握しているすべてのアクティブユニットを一覧表示するには、list-unitコマンドを使用します。 これにより、systemdがシステム上で現在アクティブにしているすべてのユニットが一覧表示されます。出力は次のようになります。 ACTIVE: ユニットがアクティブかどうかに関する状態概要。これは通常、ユニットが正常に起動したかどうかを判断する極めて基本的な方法です。

.timerだけ知りたければ

sudo systemctl list-timers --all

例えば、.timer中に複数の時間(毎日0時,12時など)を記載しても、一覧にはひとつのsaikidou.timerしか表示されない

実行された後、次のが現れる

.timer に複数の時間を設定する

https://gamingpc.one/dev/systemd-timer-cheat/

OnCalendar にカンマ区切りで指定する

例えば、以下↓なら 毎日0時、12時に実行

OnCalendar = *-*-* 0,12,:00:00

状態確認

sudo systemctl status saikidou.service -l

USBの応答状態もわかります(エラーなら動かない)

(猫カメラのUSBカメラが応答しないことをここで確認しました)

ログ確認

boot以降のログは以下↓

journalctl -b | less

https://qiita.com/hnakamur/items/a18eff87a5f0558ae538#状態の確認

systemdでは/var/log/messagesは作られず、ログの確認にはjournalctlコマンドを使うそうです。-bをつければブート以後のログのみが見られるとのこと。

journalctl について

ログが永遠にデカくなることはなさそうなので、長期運用でSDカードがログでパンパンになるという状況はなさそうだ

デフォルトで再起動時に消える(揮発性)

https://dev.classmethod.jp/articles/systemd-keep-log-on-restart-and-limit-log-filesize/

“persistent"を指定すると、電源ON/OFFでリセットされないディレクトリ("/var/log/journal”)に出力されます。

https://4thsight.xyz/373

journaldのログは、既定では「/run/log/journal」ディレクトリ配下に格納されていますが、「/run」ディレクトリはtmpfsにマウントされているため、OSを再起動すると「/run/log/journal」ディレクトリ配下に格納されているログファイルは削除されてしまいます。 そこで、OSを再起動してもログが保管されるように設定するほうほうとして、以下の2通りがあります。 /etc/systemd/journald.confで「Storage=persistent」を指定する /var/log/journalディレクトリを作成する

不揮発性にしたならサイズ 10%が上限

https://wiki.archlinux.jp/index.php/Systemd/%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8A%E3%83%AB

journal が永続的(不揮発性)の場合、デフォルトではファイルシステムの容量の 10% に制限されます (4 GiB が上限)。例えば、/var/log/journal が 20GiB の root パーティションにのっている場合、2GiB がログデータの上限になります。/etc/systemd/journald.conf の SystemMaxUse を変更すれば、最大サイズを変更できます。例えば制限を 50Mib にする場合、適切な行を次のようにアンコメント・編集します:

ログが永遠にデカくなることはない

cron を使用する方法

別記事で、ウオッチドッグタイマーを使用してラズパイを再起動する方法を記載しました。

それはシステムが異常をきたした時に自動再起動するものでした。

今回は、システム異常などは関係なく、定期的に再起動する方法を紹介します^_^

PCをずっと起動していると、調子が悪くなることがあります。そんな時は再起動をしてリセットしてあげると殆ど直ります。

ラズパイは小型の基板ですがLinuxのPCですので同じことが言えます。

定期再起動には cron を使用します^_^

私はHome Assistantを構築して長期運用していますが、cronで毎日午前3時に再起動するようにしています。

環境

  • Raspberry Pi 3B+
  • OS : Raspbian stretch9.3

crontabでcronを設定

ここでは私と同じように毎日午前3時に再起動するように設定してみます。

以下のコマンドを実行します。

$ sudo crontab -e

そして、以下のように入力します。

00 3 * * * /sbin/reboot

これで設定は完了です。

なお、上記の書式は以下のようになっていますので、午前3時ではなく例えば午前5時に再起動する場合は、3の部分を5とすればオッケーです。

分 時 日 月 曜日 実行コマンド

crontabの確認

$ sudo crontab -l

これで設定されたcronを確認できます。

cronの動作確認(logを確認)

2020/01/12追記します(^^)

crontabにはrebootを書きましたが、実際に再起動が行われているかはわからないですね。

ですので、logを確認して、cronが実行されたか確認してみます。

cronのlogは以下にありますので、カレントディレクトリを以下に移動します。

$ cd /var/log

cron.logがあるか確認します。

$ ls -l

-rw-r----- 1 root adm 22949 Jan 12 13:17 cron.log

cron.logはありました。

catで中身を確認してみます。

$ cat cron.log

.
.
.
Jan 12 03:00:01 pihost3 CRON[19603]: (root) CMD (/sbin/reboot)
Jan 12 03:02:40 pihost3 cron[392]: (CRON) INFO (pidfile fd = 3)
Jan 12 03:02:40 pihost3 cron[392]: (CRON) INFO (Running @reboot jobs)
.
.
.

ずらずらと出てきますが、1/12の3時0分1秒に/sbin/rebootの記述があり、3時2分にはRunning @reboot jobsとあるので再起動しているようです。※pihost3はhost名なのでそれぞれの環境で違います。

cronで再起動していることが確認できましたね(^^)

また、再起動だけの確認でしたら以下のコマンドを実行しても確認できるのですが、私の環境では、すべて同じ日付(1/1)となっていてうまく確認できませんでした。再起動していることはわかりますけどね。

$ last reboot

reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 still running
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:02 (18272+18:02)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:03 (18271+18:03)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:02 (18270+18:02)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:02 (18269+18:02)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:02 (18268+18:02)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:03 (18267+18:03)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:02 (18266+18:02)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:03 (18265+18:03)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:03 (18264+18:03)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:03 (18263+18:03)
reboot system boot 4.14.98-v7+ Thu Jan 1 09:00 - 03:02 (18262+18:02)

以上です^_^