systemd timerとは?cronより便利なLinuxタスクスケジューラーの使い方完全ガイド

Linux

「定期的にスクリプトを実行したいけど、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 timercron
設定方法Unit ファイルcrontab
ログ管理journalctl で統合個別に設定必要
依存関係設定可能なし
起動タイミング柔軟(起動後、アイドル時など)時刻のみ
エラー処理自動リトライ可能手動実装
リソース制限CPU/メモリ制限可能制限なし
実行ユーザー柔軟に指定crontab所有者
タイムゾーン個別設定可能システム依存

systemd timerの方が圧倒的に高機能!


systemd timerの仕組み

2つのファイルで構成

必要なファイル:

  1. .service ファイル 実行する内容を定義 どのコマンド/スクリプトを実行するか
  2. .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

移行のメリット

  1. ログ管理が楽
    • journalctl で一元管理
    • エラーも自動記録
  2. 依存関係を設定可能
    • ネットワーク起動後に実行など
  3. リソース制限
    • CPU/メモリを制限可能
  4. エラー処理
    • 自動リトライ設定可能

トラブルシューティング

よくある問題と解決法

問題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について、理解できましたか?

重要ポイントまとめ:

  1. cronより高機能
    • 柔軟な実行タイミング
    • 優れたログ管理
    • 依存関係の設定
  2. 2つのファイルで構成
    • .service(何を実行)
    • .timer(いつ実行)
  3. 管理が簡単
    • systemctl で統一管理
    • journalctl でログ確認
  4. 移行は簡単
    • cronと併用可能
    • 段階的に移行

最後のアドバイス:

最初は簡単なタスクから始めて、慣れてきたら複雑な設定に挑戦してみてください。cronより覚えることは多いですが、それ以上のメリットがあります。

モダンなLinuxシステム管理を、systemd timerで始めましょう!⏰

コメント

タイトルとURLをコピーしました