Replace cron with systemd.timer (Archlinux)

Archlinux 標準では cron がインストールされていない.ジョブの定期実行は systemd.timer を利用している.systemd.timer の利点は systemd の機能を利用できる点.欠点は設定が煩雑な点と一部機能の欠落.

結論

特別な理由がなければ cron を使いましょうw

system job

systemctl list-timers を実行すると定期実行されるサービスの一覧が得られる. locate して中身を見ればだいたい理解できる.次のような service ファイルと timer ファイルを作成し timersystemctl 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 を使えば良いと思います.