systemd Timersで定期タスクを管理する
Linuxシステムでは、定期タスクはcronと関連付けられることが多いです。cronはシンプルで広く利用可能であり、今日でも有用です。しかし、systemdを使用する最近のLinuxディストリビューションには、別の強力な選択肢があります:systemd timers。
systemd timerは、特定の時刻、起動後、または定期的な間隔でサービスを実行できます。従来のcronジョブと比較して、systemd timersはシステムサービスマネージャーとの統合が良く、ログ機能が優秀で、スケジューリングの柔軟性も高くなります。
この記事では、systemd timersの仕組みと設定方法を説明します。
systemd Timerとは?
systemd timerは、別のsystemdユニットをいつアクティブ化するかを制御するユニットファイルです。多くの場合、timerは.serviceユニットをアクティブ化します。
典型的な定期タスクには2つのファイルが必要です:
/etc/systemd/system/example-task.service
/etc/systemd/system/example-task.timer
.serviceファイルは実行内容を定義します。.timerファイルは実行時刻を定義します。この分離により、systemd timersは整理されやすく管理も簡単です。
簡単な例:日次バックアップ
毎日バックアップスクリプトを実行する場合を考えます。
まずスクリプトを作成します:
sudo nano /usr/local/bin/daily-backup.sh
例:
#!/bin/bash
echo "Backup started at Thu Jun 11 11:24:12 2026" >> /var/log/daily-backup.log
tar -czf /tmp/etc-backup.tar.gz /etc
echo "Backup finished at Thu Jun 11 11:24:12 2026" >> /var/log/daily-backup.log
実行権限を設定します:
sudo chmod +x /usr/local/bin/daily-backup.sh
Serviceユニットの作成
サービスファイルを作成します:
sudo nano /etc/systemd/system/daily-backup.service
内容:
[Unit]
Description=Daily backup task
[Service]
Type=oneshot
ExecStart=/usr/local/bin/daily-backup.sh
Type=oneshotは、サービスがコマンドを実行して終了することを意味します。バックアップ、クリーンアップ、レポートなどの一次性タスクに適しています。
Timerユニットの作成
タイマーファイルを作成します:
sudo nano /etc/systemd/system/daily-backup.timer
内容:
[Unit]
Description=Run daily backup task
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
OnCalendar=dailyは、systemdに毎日1回サービスを実行するよう指示します。Persistent=trueは、マシンがスケジュール時刻に停止していた場合、起動後に未実行タスクを補完実行します。
Timerの有効化と起動
systemdを再読み込みし、タイマーを有効にします:
sudo systemctl daemon-reload
sudo systemctl enable --now daily-backup.timer
タイマーの状態を確認します:
systemctl status daily-backup.timer
すべてのアクティブなタイマーを一覧表示します:
systemctl list-timers
ログの確認
タスクはsystemdサービスとして実行されるため、journalctlでログを確認できます:
journalctl -u daily-backup.service
リアルタイムでログを追跡します:
journalctl -u daily-backup.service -f
これは、cronの出力を手動でリダイレクトしたりローカルメールを確認するよりも便利です。
一般的なTimerオプション
起動後に実行
起動後5分で実行:
OnBootSec=5min
定期実行
30分ごとに実行:
OnBootSec=5min
OnUnitActiveSec=30min
OnUnitActiveSecは、前回のアクティブ化後30分で再度実行することを意味します。
特定時刻に実行
毎日03:30:
OnCalendar=*-*-* 03:30:00
毎週月曜04:00:
OnCalendar=Mon 04:00
毎月1日 00:00:
OnCalendar=*-*-01 00:00:00
Serviceの手動テスト
timerに頼る前に、サービスを手動でテストします:
sudo systemctl start daily-backup.service
systemctl status daily-backup.service
journalctl -u daily-backup.service
Timerの無効化と削除
停止および無効化:
sudo systemctl disable --now daily-backup.timer
完全に削除:
sudo rm /etc/systemd/system/daily-backup.service
sudo rm /etc/systemd/system/daily-backup.timer
sudo systemctl daemon-reload
systemd TimerとCronの比較
Cronは、特に最小構成のシステムで単純なジョブに適しています。しかし、systemd timersにはいくつかの利点があります:
- システムサービスとの統合が優れている
- journalctlでログ確認が容易
- 他のsystemdユニットへの依存が可能
- Persistent=trueで未実行タスクの補完が可能
- スケジューリングオプションがより柔軟
- スケジュールとタスクのロジックが明確に分離
systemdを既に使用しているサーバーでは、timersがより整理された保守性の高いソリューションです。
まとめ
systemd timersは、Linuxでの定期タスク管理のためのモダンな強力な方法です。基本的なtimerは2つのファイルだけが必要です:.serviceファイルでタスクを定義し、.timerファイルでスケジュールを定義します。この構造を理解すれば、systemd timersは従来のcronジョブよりも使いやすく、デバッグも簡単になります。