はじめに
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.