読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】cron の代わりに systemd のタイマー? .timer と .service、OnCalendar と OnBootSec、list-timers、systemd-run【LPICレベル1】

23レスカテゴリ:Linux
1: 名無しさん

毎日動かすバックアップ、cron やなくて systemd のタイマーで書けって言われた
何が違うん

2: 名無しさん

前提のおさらい。cron は crontab に「分 時 日 月 曜日 コマンド」を書いて、決まった時刻にコマンドを動かす。systemd では、サービスなどの単位をユニットと呼んで、systemctl で操作する

3: 名無しさん

>>1
タイマーは2つのユニットの組み合わせ。何をするかを書いた .service と、いつするかを書いた .timer
backup.timer は、同じ名前の backup.service を動かす。名前を変えたいときは [Timer] に Unit= を書く

4: 名無しさん

>>3
中身の例を見せて

5: 名無しさん

>>4
backup.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
backup.timer
[Timer]
OnCalendar=*-*-* 2:30
Persistent=true
[Install]
WantedBy=timers.target

6: 名無しさん

>>5
有効にするのは .service やなくて .timer のほう。systemctl enable --now backup.timer

7: 名無しさん

>>5
OnCalendar の書き方がよう分からん

8: 名無しさん

>>7
基本は「曜日 年-月-日 時:分:秒」。systemd-analyze calendar で、正しく読めるか確かめられる。試した結果
daily → *-*-* 00:00:00
weekly → Mon *-*-* 00:00:00
monthly → *-*-01 00:00:00
Mon..Fri *-*-* 8:30 → Mon..Fri *-*-* 08:30:00

9: 名無しさん

>>8
15分おきは *-*-* *:00/15(正規化すると *-*-* *:00/15:00)。1日に

回。cron の */15 * * * * と同じ

10: 名無しさん

起動してからしばらくして動かす、みたいなのもできる?

11: 名無しさん

>>10
できる。時計の時刻やなくて、経過時間で決めるのが OnBootSec(起動してから)や OnUnitActiveSec(前に動いてから)。試したマシンの systemd-tmpfiles-clean.timer は
OnBootSec=15min
OnUnitActiveSec=1d
で、起動の15分後と、その後は1日おき

12: 名無しさん

>>11
OnCalendar はリアルタイムのタイマー、OnBootSec などはモノトニックのタイマーって呼ぶ

13: 名無しさん

>>5
Persistent=true は何?

14: 名無しさん

>>13
電源が切れてて動かせなかった分を、次に起動したときにすぐ動かす。OnCalendar にだけ効く(systemd.timer の man)
cron にはないところで、cron でこれをやるなら anacron を使う

15: 名無しさん

>>14
試したマシンの fstrim.timer は OnCalendar=weekly、Persistent=true に加えて RandomizedDelaySec=100min で、たくさんのマシンが同時に動き出さないようにずらしてた。AccuracySec の既定は 1min で、そのくらいのずれは起こりうる

16: 名無しさん

>>6
登録したタイマーの確認は?

17: 名無しさん

>>16
systemctl list-timers。次に動く時刻(NEXT)、それまでの時間(LEFT)、前に動いた時刻(LAST)、タイマー名(UNIT)、動かすユニット(ACTIVATES)が並ぶ。止まってるのも含めるなら --all
出力は cron みたいにメールやなくて journal に入るから journalctl -u backup.service で見る

18: 名無しさん

ユニットファイルを書かずに、1回だけ後で動かしたい

19: 名無しさん

>>18
systemd-run で一時的なタイマーを作れる
systemd-run --on-active=30 /bin/touch /tmp/foo で30秒後に1回(man の例)。--on-calendar=、--on-boot= もある。一般ユーザーの自分用なら --user
作られた run-….timer と run-….service は、終わったら消える

20: 名無しさん

>>19
at と似た使い方ができるんか。ただ、試したマシンは systemd が PID 1 で動いてないコンテナで、systemctl も systemd-run も使われへんかった。書式の確認は systemd-analyze calendar と man でやった

21: 名無しさん

>>3
ユーザー自分用のタイマーも作れるん?

22: 名無しさん

>>21
~/.config/systemd/user/ に置いて systemctl --user enable --now 名前.timer。システム全体のは /etc/systemd/system/ に置く

23: 名無しさん

>>3
.service に何をするか、.timer にいつか。有効にするのは .timer、OnCalendar は systemd-analyze calendar で確かめる。一覧は list-timers、ログは journalctl。整理できた

管理人のひとこと