毎日動かすバックアップ、cron やなくて systemd のタイマーで書けって言われた
何が違うん
【疑問】cron の代わりに systemd のタイマー? .timer と .service、OnCalendar と OnBootSec、list-timers、systemd-run【LPICレベル1】
前提のおさらい。cron は crontab に「分 時 日 月 曜日 コマンド」を書いて、決まった時刻にコマンドを動かす。systemd では、サービスなどの単位をユニットと呼んで、systemctl で操作する
>>1
タイマーは2つのユニットの組み合わせ。何をするかを書いた .service と、いつするかを書いた .timer
backup.timer は、同じ名前の backup.service を動かす。名前を変えたいときは [Timer] に Unit= を書く
>>3
中身の例を見せて
>>4
backup.service[Service]Type=oneshotExecStart=/usr/local/bin/backup.sh
backup.timer[Timer]OnCalendar=*-*-* 2:30Persistent=true[Install]WantedBy=timers.target
>>5
有効にするのは .service やなくて .timer のほう。systemctl enable --now backup.timer
>>5
OnCalendar の書き方がよう分からん
>>7
基本は「曜日 年-月-日 時:分:秒」。systemd-analyze calendar で、正しく読めるか確かめられる。試した結果daily → *-*-* 00:00:00weekly → Mon *-*-* 00:00:00monthly → *-*-01 00:00:00Mon..Fri *-*-* 8:30 → Mon..Fri *-*-* 08:30:00
>>8
15分おきは *-*-* *:00/15(正規化すると *-*-* *:00/15:00)。1日に
回。cron の */15 * * * * と同じ
起動してからしばらくして動かす、みたいなのもできる?
>>10
できる。時計の時刻やなくて、経過時間で決めるのが OnBootSec(起動してから)や OnUnitActiveSec(前に動いてから)。試したマシンの systemd-tmpfiles-clean.timer はOnBootSec=15minOnUnitActiveSec=1d
で、起動の15分後と、その後は1日おき
>>11
OnCalendar はリアルタイムのタイマー、OnBootSec などはモノトニックのタイマーって呼ぶ
>>5
Persistent=true は何?
>>13
電源が切れてて動かせなかった分を、次に起動したときにすぐ動かす。OnCalendar にだけ効く(systemd.timer の man)
cron にはないところで、cron でこれをやるなら anacron を使う
>>14
試したマシンの fstrim.timer は OnCalendar=weekly、Persistent=true に加えて RandomizedDelaySec=100min で、たくさんのマシンが同時に動き出さないようにずらしてた。AccuracySec の既定は 1min で、そのくらいのずれは起こりうる
>>6
登録したタイマーの確認は?
>>16systemctl list-timers。次に動く時刻(NEXT)、それまでの時間(LEFT)、前に動いた時刻(LAST)、タイマー名(UNIT)、動かすユニット(ACTIVATES)が並ぶ。止まってるのも含めるなら --all
出力は cron みたいにメールやなくて journal に入るから journalctl -u backup.service で見る
ユニットファイルを書かずに、1回だけ後で動かしたい
>>18
systemd-run で一時的なタイマーを作れるsystemd-run --on-active=30 /bin/touch /tmp/foo で30秒後に1回(man の例)。--on-calendar=、--on-boot= もある。一般ユーザーの自分用なら --user
作られた run-….timer と run-….service は、終わったら消える
>>19
at と似た使い方ができるんか。ただ、試したマシンは systemd が PID 1 で動いてないコンテナで、systemctl も systemd-run も使われへんかった。書式の確認は systemd-analyze calendar と man でやった
>>3
ユーザー自分用のタイマーも作れるん?
>>21
~/.config/systemd/user/ に置いて systemctl --user enable --now 名前.timer。システム全体のは /etc/systemd/system/ に置く
>>3
.service に何をするか、.timer にいつか。有効にするのは .timer、OnCalendar は systemd-analyze calendar で確かめる。一覧は list-timers、ログは journalctl。整理できた
管理人のひとこと
- systemd のタイマーは .timer(いつ)と同じ名前の .service(何を)の組み合わせ。Unit= で別のユニットも指定できる。有効にするのは .timer(
systemctl enable --now x.timer、WantedBy=timers.target)。 - OnCalendar=(リアルタイム):「曜日 年-月-日 時:分:秒」。daily は
*-*-* 00:00:00、weekly はMon *-*-* 00:00:00。systemd-analyze calendarで確認できる。OnBootSec=・OnUnitActiveSec=(モノトニック)は経過時間で決める。 - Persistent=true は止まっていた間に逃した分を起動後に実行する(OnCalendar のみ)。RandomizedDelaySec= で開始をずらし、AccuracySec= の既定は 1min。
- 一覧は
systemctl list-timers(--all)。出力は journal に入る。systemd-run --on-active=30 コマンドなどで一時的なタイマーを作れる(--on-calendar=、--user)。