「定期的にスクリプトを実行したいけど、cronは複雑…」 「システム起動時や特定のタイミングでタスクを実行したい」 「cronのログが見づらくて困っている」
Linuxでタスクのスケジューリングといえばcronが定番でしたが、実はsystemd timerという、より柔軟で管理しやすい方法があるんです!
systemd timerは、ログ管理が楽で、依存関係を設定でき、システムと統合された現代的なスケジューラーです。
この記事では、systemd timerの基本から実践的な使い方、cronとの違いまで、初心者にも分かりやすく完全解説します。
systemd timerとは?基本を理解しよう

systemd timer の概要
systemd timerとは:
- systemdに統合されたタスクスケジューラー
- cronの代替として使える
- より柔軟で高機能
- systemdを採用している最新のLinuxで利用可能
- 2つのファイル(.service と .timer)で構成
簡単に言うと:
systemd timer = cronの進化版
より細かい制御、より良いログ、より簡単な管理
cronとの比較
機能比較表:
機能 | systemd timer | cron |
---|---|---|
設定方法 | Unit ファイル | crontab |
ログ管理 | journalctl で統合 | 個別に設定必要 |
依存関係 | 設定可能 | なし |
起動タイミング | 柔軟(起動後、アイドル時など) | 時刻のみ |
エラー処理 | 自動リトライ可能 | 手動実装 |
リソース制限 | CPU/メモリ制限可能 | 制限なし |
実行ユーザー | 柔軟に指定 | crontab所有者 |
タイムゾーン | 個別設定可能 | システム依存 |
systemd timerの方が圧倒的に高機能!
systemd timerの仕組み
2つのファイルで構成
必要なファイル:
.service
ファイル実行する内容を定義 どのコマンド/スクリプトを実行するか
.timer
ファイルいつ実行するかを定義 スケジュールや条件を設定
ファイルの配置場所:
システム全体:/etc/systemd/system/
ユーザー個人:~/.config/systemd/user/
基本的な動作フロー
1. timerユニットが時間を監視
↓
2. 指定時刻/条件になったら
↓
3. 対応するserviceユニットを起動
↓
4. タスクを実行
↓
5. ログをjournalに記録
【実践】systemd timerの作成方法
Step 1: serviceファイルの作成
例:バックアップスクリプトを実行する場合
/etc/systemd/system/backup.service
を作成:
[Unit]
Description=Daily Backup Service
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup-user
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
各セクションの説明:
[Unit]
:サービスの説明と依存関係[Service]
:実行内容の詳細[Install]
:有効化時の設定
Step 2: timerファイルの作成
/etc/systemd/system/backup.timer
を作成:
[Unit]
Description=Daily Backup Timer
Requires=backup.service
[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=1h
[Install]
WantedBy=timers.target
Timer セクションの重要オプション:
OnCalendar
:実行スケジュールPersistent
:システム停止中の実行を後で補うRandomizedDelaySec
:実行時刻のランダム化
Step 3: 有効化と起動
# ファイルを再読み込み
sudo systemctl daemon-reload
# timerを有効化(自動起動)
sudo systemctl enable backup.timer
# timerを開始
sudo systemctl start backup.timer
# 状態確認
sudo systemctl status backup.timer
OnCalendarの時刻指定方法
基本的な指定方法
よく使う指定:
# 毎日
OnCalendar=daily
# 毎週月曜日
OnCalendar=weekly
OnCalendar=Mon
# 毎月1日
OnCalendar=monthly
# 毎時0分
OnCalendar=hourly
# 毎分
OnCalendar=minutely
詳細な時刻指定
フォーマット:
DayOfWeek Year-Month-Day Hour:Minute:Second
例:
# 毎日午前3時30分
OnCalendar=*-*-* 03:30:00
# 平日の9時から17時まで毎時
OnCalendar=Mon..Fri *-*-* 09..17:00:00
# 毎月15日の12時
OnCalendar=*-*-15 12:00:00
# 毎週日曜日の23時30分
OnCalendar=Sun *-*-* 23:30:00
# 5分ごと
OnCalendar=*:0/5
特殊な実行タイミング
# システム起動後5分
OnBootSec=5min
# 最後の実行から1時間後
OnUnitActiveSec=1h
# システムがアイドル状態になってから10分後
OnUnitInactiveSec=10min
# 複数の条件を組み合わせ
OnCalendar=daily
OnBootSec=10min
実用的な設定例
例1:ログローテーション
logrotate.service:
[Unit]
Description=Rotate logs
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf
logrotate.timer:
[Unit]
Description=Daily log rotation
[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true
[Install]
WantedBy=timers.target
例2:データベースバックアップ
db-backup.service:
[Unit]
Description=MySQL Database Backup
After=mysql.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/mysql-backup.sh
User=mysql
Group=mysql
StandardOutput=journal
StandardError=journal
# リソース制限
CPUQuota=50%
MemoryMax=1G
db-backup.timer:
[Unit]
Description=Daily database backup at 2 AM
[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=30min
Persistent=true
[Install]
WantedBy=timers.target
例3:システム更新チェック
update-check.service:
[Unit]
Description=Check for system updates
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/apt update
ExecStartPost=/usr/bin/apt list --upgradable
update-check.timer:
[Unit]
Description=Check for updates every 6 hours
[Timer]
OnBootSec=10min
OnUnitActiveSec=6h
[Install]
WantedBy=timers.target
systemd timerの管理コマンド
基本的な管理コマンド
# すべてのtimerを表示
systemctl list-timers --all
# 特定のtimerの状態確認
systemctl status backup.timer
# timerの開始/停止
sudo systemctl start backup.timer
sudo systemctl stop backup.timer
# timerの有効化/無効化
sudo systemctl enable backup.timer
sudo systemctl disable backup.timer
# 手動でserviceを実行(テスト用)
sudo systemctl start backup.service
ログの確認方法
# timerのログを確認
journalctl -u backup.timer
# serviceのログを確認
journalctl -u backup.service
# 最新のログをリアルタイム表示
journalctl -u backup.service -f
# 今日のログのみ
journalctl -u backup.service --since today
# エラーログのみ
journalctl -u backup.service -p err
次回実行時刻の確認
# すべてのtimerと次回実行時刻
systemctl list-timers
# 特定のtimerの詳細
systemctl show backup.timer
# カレンダーフォーマットのテスト
systemd-analyze calendar "daily"
systemd-analyze calendar "*-*-* 03:00:00"
cronからの移行
crontabエントリの変換例
cron:
# 毎日午前3時に実行
0 3 * * * /usr/local/bin/backup.sh
systemd timer:
OnCalendar=*-*-* 03:00:00
cron:
# 5分ごと
*/5 * * * * /usr/local/bin/check.sh
systemd timer:
OnCalendar=*:0/5
cron:
# 平日の9時
0 9 * * 1-5 /usr/local/bin/weekday.sh
systemd timer:
OnCalendar=Mon..Fri *-*-* 09:00:00
移行のメリット
- ログ管理が楽
- journalctl で一元管理
- エラーも自動記録
- 依存関係を設定可能
- ネットワーク起動後に実行など
- リソース制限
- CPU/メモリを制限可能
- エラー処理
- 自動リトライ設定可能
トラブルシューティング
よくある問題と解決法
問題1:timerが実行されない
# 原因調査
systemctl status my.timer
journalctl -u my.timer -e
# 解決策
sudo systemctl daemon-reload
sudo systemctl restart my.timer
問題2:Persistent が効かない
# OnCalendar と組み合わせて使用
OnCalendar=daily
Persistent=true # これで機能する
問題3:ユーザーtimerが動かない
# ユーザーサービスの有効化
systemctl --user enable my.timer
systemctl --user start my.timer
# ログイン時の自動起動
loginctl enable-linger username
よくある質問(FAQ)
Q:cronと併用できる?
A: はい、問題なく併用できます。
徐々に移行していくのがおすすめです。新しいタスクからsystemd timerを使いましょう。
Q:秒単位の実行は可能?
A: はい、可能です。
# 30秒ごと
OnCalendar=*:*:0/30
Q:実行に失敗したら?
A: 自動リトライを設定できます。
[Service]
Restart=on-failure
RestartSec=5min
Q:古いシステムでも使える?
A: systemdが必要です。
CentOS 7以降、Ubuntu 15.04以降、Debian 8以降なら使えます。
まとめ:systemd timerで現代的なタスク管理を!
systemd timerについて、理解できましたか?
重要ポイントまとめ:
- cronより高機能
- 柔軟な実行タイミング
- 優れたログ管理
- 依存関係の設定
- 2つのファイルで構成
- .service(何を実行)
- .timer(いつ実行)
- 管理が簡単
- systemctl で統一管理
- journalctl でログ確認
- 移行は簡単
- cronと併用可能
- 段階的に移行
最後のアドバイス:
最初は簡単なタスクから始めて、慣れてきたら複雑な設定に挑戦してみてください。cronより覚えることは多いですが、それ以上のメリットがあります。
モダンなLinuxシステム管理を、systemd timerで始めましょう!⏰
コメント