blog.monophile.net

コンピュータに関するメモ。

著者

山本一彰(Takaaki Yamamoto)

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 2015年にコンビネータ論理を基に計算完備な計算手法 "論理珠算"を開発し、 それを含む体系である"算道"を構成した。 その成果により、2016年に 第19回 文化庁メディア芸術祭 アート部門 新人賞 (文部科学大臣賞) を受賞。 現在はSRE(サイト信頼性エンジニア)として生計をたててている。

投稿

cron の代わりに Systemd の timer で定期実行を定義してみる

概要

UNIX 環境で定期的に処理を実行する場合は一般的に cron を使う。 しかし、cron を使うとログのことに気を遣うのが嫌だった。 (ログの置き場所とか、ログのローテーションとか…。) Systemd だと journald が一括してログを管理してくれて便利そうだったので、試してみた。 (journaldの設定は /etc/systemd/journald.conf を編集すればよい。)

今回は5秒毎くらいに hello を標準出力する処理を実装してみる。 試した環境は Ubuntu16.04。

systemd.timer の設定について

Systemd の timer を使うためには最低2つのファイルが必要になる。 一つは {{ name }}.service という処理そのものを定義するファイルで、 もう一つは {{ name }}.service をどのタイミングで実行するかを定義する {{ name }}.timer というファイル。 {{ name }} は service と timer で異なっている場合は [Timer] のセクションで明示的に Unit= の指定が必要になる。

マニュアルは↓でみれる。

わかりやすかったのは↓のwiki。

echo@.service

/lib/systemd/system/echo@.service を↓のように記述する。

[Unit]
Description = echo service

[Service]
Type = oneshot
ExecStart = /bin/echo %i

↑のサービスは↓を実行すると /bin/echo hoge が実行される。

つまり、 echo@AAAA.serviceAAAA%i に代入されて実行される。

echo@.timer

上記で定義したサービス echo@.service2+5n 秒毎(誤差3秒)に実行する echo@.timer を定義する。

/lib/systemd/system/echo@.timer

[Unit]
Description = echo@ timer
Wants = multi-user.target
After = multi-user.target

[Timer]
OnCalendar = *-*-* *:*:2/5
RandomizedDelaySec = 3s
Unit = echo@%i.service

[Install]
WantedBy = timers.target

.timer でも .service と同じように @%i を用いた置換を行うことができる。

タイマーを起動する

↓で再起動後に自動的に echo@hello.timer が起動するように設定する。

↓で echo@hello.timer を起動する。

すると echo@hello.timer の状態は↓になる。

↓でだいたい5秒ごとくらいに echo@hello.service が動いていることが確認できる。

(おまけ) 定義されている timer を確認する

systemctl list-timers --all を実行することで設定されている timer の状態を確認できる。

(おまけ) サービスの依存関係

Systemd はサービスの依存関係を細かく設定できるが、 ユーザレベルで動く処理は multi-user.target に依存するように指定しておけば良いと思う。 詳しくは↓を参照。

参考