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など拡張子別にたくさん表示される
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”)に出力されます。
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)
以上です^_^