Replace cron with systemd.timer (Archlinux)
コンテンツ
Archlinux 標準では cron がインストールされていない.ジョブの定期実行は systemd.timer を利用している.systemd.timer の利点は systemd の機能を利用できる点.欠点は設定が煩雑な点と一部機能の欠落.
system job
systemctl list-timers
を実行すると定期実行されるサービスの一覧が得られる. locate
して中身を見ればだいたい理解できる.次のような service
ファイルと timer
ファイルを作成し timer
を systemctl enable
する.
<unit-name>.timer
で実行スケジュールを設定する. 次は /usr/lib/systemd/system/logrotate.timer
の内容
[Unit]
Description=Daily rotation of log files
[Timer]
OnCalendar=daily
AccuracySec=12h
Persistent=true
Persistent=true
と設定することで電源オフなどで実行タイミングを逃した際に後から実行できる. OnCalendar=daily
は 毎日 0時0分の省略. AccuracySec
はポーリング間隔(なので,ジョブは 0時0分から12時0分の間に実行されるはずだが,毎回 0時0分に実行されていた謎).
<unit-name>.service
で実行する内容を設定する.次は /usr/lib/systemd/system/logrotate.service
の内容.
[Unit]
Description=Rotate log files
[Service]
Type=oneshot
ExecStart=/usr/bin/logrotate /etc/logrotate.conf
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7
Type=oneshot
の場合は ExecStart
を複数記述できる.上から順に実行される( man-db.service
参照).また, Nice
, IOSchedulingClass
などでジョブの優先度を設定している.詳しくはマニュアル参照.
user job
system job と同じで ~/.config/systemd/user
に設定ファイルを作成する.また, systemd
の実行時に --user
オプションを追加する.
ただし,systemd のユーザ毎のインスタンスはそのユーザが最初にログインする際にスタートし,最後のセッションが終了すると同時にsystemdのユーザインスタンスも終了する.ログインなしに systemd のユーザインスタンスを作成したいこともある.その際は次のコマンドを実行する.
loginctl enable-linger username
感想
上で見たように結構面倒なので cron を使えば良いと思います.
作成者 Toru Mano
最終更新時刻 2023-01-01 (c70d5a1)