全力で怠けたい

怠けるために全力を尽くしたいブログ。

Arch Linux でジョブをスケジュール実行するには systemd のタイマーが使える。

はじめに

Arch Linux でジョブをスケジュール実行するには systemd のタイマーが使える。systemd のタイマーを使ってジョブをスケジュール実行する方法をメモしておく。

自分はジョブをスケジュール実行するときは cron を使うことが多いけど Arch Linux はデフォルトでは cron はインストールされない。 cron は cronie とかの実装があるので自分でインストールしたら使えるようになるけど、systemd のタイマーを使うと簡単にジョブをスケジュール実行することができる。

systemd のタイマーの使い方

systemd のタイマーを使うにはサービスのユニットファイルとタイマーのユニットファイルを作っていく。

とりあえずサービスのユニットファイルは hello world/tmp/helloworld.log に追記して、startend を標準出力に出力するだけのシンプルなものに。

あとサーブスのユニットは有効にする必要はないので [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.

参考サイト