背景
systemdはLinuxで広く使われているinitシステムであり、サービス管理だけでなく定期ジョブのスケジュールも担当します。従来はcronを用いていた処理をsystemdタイマーで統一的に管理することで、依存関係やログの扱いが容易になり、サービスとタイマーを1つのユニット体系にまとめることができます。本記事では、systemdタイマーの基本概念と設定方法を中級者向けに解説します。
手順
1. **タイマーとサービスユニットの関係を理解する**
systemdタイマーは「タイマー(.timer)」ユニットと「サービス(.service)」ユニットのセットで機能します。タイマーは発火条件を定義し、実際の処理はサービスユニットが行います。例えばバックアップスクリプトを定期実行したい場合、スクリプトを呼び出すサービスユニットと、そのサービスを毎日午前2時に起動するタイマーを作成します。
2. **サービスユニットを作成する**
まずは実行したいコマンドやスクリプトを呼び出す `.service` ファイルを `/etc/systemd/system/` に用意します。例えば `/usr/local/bin/backup.sh` を実行する場合は以下のようにします:
```
[Unit]
Description=Daily Backup Script
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
```
`Type=oneshot` は短時間で終了する処理に使います。長時間動作させたい場合は `simple` や `forking` を選択します。
3. **タイマーユニットを作成する**
次に `.timer` ファイルを作成し、起動時刻や間隔を指定します。先程のサービスを毎日2時に起動する例は次のとおりです:
```
[Unit]
Description=Run backup script daily at 2AM
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
```
`OnCalendar` には日時指定を行います。例えば `OnBootSec=10min` で起動後10分後に一度だけ実行する設定も可能です。`Persistent=true` を指定すると、システムが停止していた場合でも次回起動時に逃したスケジュールを補完します。
4. **タイマーを有効化して起動する**
ユニットファイルを作成したら `systemctl daemon-reload` で設定を読み込み、`sudo systemctl enable backup.timer` と `sudo systemctl start backup.timer` でタイマーを有効化・起動します。`list-timers` サブコマンドを使うと登録済みのタイマーと次回実行時刻を確認できます。実行履歴は `journalctl -u backup.service` や `journalctl -u backup.timer` で確認可能です。
5. **カスタムスケジュールと注意点**
`OnCalendar` は曜日指定や月次実行など柔軟に設定できます。例えば毎月第一月曜日なら `OnCalendar=Mon *-*-1..7 02:00` のように記述します。タイマーで実行するスクリプト内で環境変数やPATHが通常のシェルと異なる場合があるので、絶対パスを指定するか、ユニットファイルに `Environment=` 行を追加しましょう。また、サービスユニット内でユーザー権限を指定するためには `User=` や `Group=` ディレクティブを使用します。
まとめ
systemdタイマーを利用することで、cronに頼らずsystemd上で統一的に定期ジョブを管理できます。サービスユニットとタイマーユニットをセットで定義し、`OnCalendar` などのパラメータで柔軟なスケジュールを設定するだけで、再起動後もタスクを自動で実行できます。systemdに慣れておくことで、ログの統合管理や依存関係の定義も含めた高度なサービス運用が可能になります。まずは簡単なバックアップスクリプトやキャッシュ掃除タスクから試してみて、運用に取り入れてみてください。