はじめに
Arch Linux でジョブをスケジュール実行するには systemd のタイマーが使える。systemd のタイマーを使ってジョブをスケジュール実行する方法をメモしておく。
自分はジョブをスケジュール実行するときは cron を使うことが多いけど Arch Linux はデフォルトでは cron はインストールされない。 cron は cronie とかの実装があるので自分でインストールしたら使えるようになるけど、systemd のタイマーを使うと簡単にジョブをスケジュール実行することができる。
systemd のタイマーの使い方
systemd のタイマーを使うにはサービスのユニットファイルとタイマーのユニットファイルを作っていく。
とりあえずサービスのユニットファイルは hello world を /tmp/helloworld.log に追記して、start と end を標準出力に出力するだけのシンプルなものに。
あとサーブスのユニットは有効にする必要はないので [Install] セクションは記載しなくてよい (有効にするのはタイマーのユニットなので)
$ cat /etc/systemd/system/helloworld.service [Unit] Description=hello world RefuseManualStart=no RefuseManualStop=no [Service] Type=oneshot ExecStart=/usr/bin/bash -c 'echo start; echo "hello world" >> /home/svc1/helloworld.log; echo end'
タイマーのユニットファイルはこんな感じに記載する。
タイマーのユニットファイルは拡張子を .timer にしてサービスのユニットファイルは拡張子を .service にするけど、2つのユニットファイルのベースファイル名は同じにしておく。
OnCalendar=minutely を指定してタイマーが1分ごとに動くようにしている。
タイマーのオプションは systemd.timer(5) に、あとカレンダーイベントとタイムスパンの構文は systemd.time(7) に書いてある。
$ cat /etc/systemd/system/helloworld.timer [Unit] Description=Run Hello World minutely [Timer] OnCalendar=minutely Persistent=true [Install] WantedBy=timers.target
ユニットファイルを作成したらタイマーのユニットを開始と自動起動を有効にする。
# タイマーのユニットを開始する
$ sudo systemctl start helloworld.timer
# タイマーのユニットの自動起動を有効にする
$ sudo systemctl enable helloworld.timer
Created symlink /etc/systemd/system/timers.target.wants/helloworld.timer → /etc/systemd/system/helloworld.timer.
$ systemctl status helloworld.timer
● helloworld.timer - Run Hello World minutely
Loaded: loaded (/etc/systemd/system/helloworld.timer; disabled; vendor preset: disabled)
Active: active (running) since Thu 2021-09-16 21:00:32 JST; 32s ago
Trigger: n/a
Triggers: ● helloworld.service
Sep 16 21:00:32 localhost systemd[1]: Started Run Hello World minutely.
/tmp/helloworld.log を見てると1分ごとに hello world が追記していく。
タイマーのユニットがちゃんと1分ごとにサービスのユニットを起動している。
$ tail -f /tmp/helloworld.log hello world hello world hello world hello world
journalctl コマンドを実行するとサービスのログを表示する。
$ journalctl -e -u helloworld.service Sep 16 21:01:41 localhost systemd[1]: Starting hello world... Sep 16 21:01:41 localhost bash[1999]: start Sep 16 21:01:41 localhost bash[1999]: end Sep 16 21:01:41 localhost systemd[1]: helloworld.service: Deactivated successfully. Sep 16 21:01:41 localhost systemd[1]: Finished hello world.
ユニットファイルの設定を変えたら sudo systemctl daemon-reload コマンドを実行して設定を反映するのは普通のサービスと同じ。
$ sudo systemctl daemon-reload
タイマーの一覧を表示する
起動しているタイマーの一覧は systemctl list-timers コマンドを実行して表示する。
$ systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES > Thu 2021-09-16 20:55:00 JST 8s left Thu 2021-09-16 20:54:05 JST 46s ago helloworld.timer helloworld.> Fri 2021-09-17 00:00:00 JST 3h 5min left Thu 2021-09-16 11:15:00 JST 9h ago shadow.timer shadow.serv> Fri 2021-09-17 20:20:44 JST 23h left Thu 2021-09-16 20:20:44 JST 34min ago systemd-tmpfiles-clean.timer systemd-tmp> 3 timers listed. Pass --all to see loaded but inactive timers, too.