Cron
クラシックUnixジョブスケジューラー
Systemd Timer
モダンサービスベーススケジューラー
CronとSystemd Timerスケジューラーの包括的な比較。いつ使用するか、機能、長所と短所、および移行方法を学びます。
Quick Comparison
| Feature | ⏰ Cron | ⚙️ Systemd Timer |
|---|---|---|
| スケジューリングスタイル | 時間ベースのみ | 時間またはイベントベース |
| 粒度 | 分 | マイクロ秒 |
| 依存関係 | なし | 完全サポート |
| ロギング | 基本メール/ログ | journald統合 |
| ユーザーごとのジョブ | はい | はい |
| モノトニックタイマー | いいえ | はい |
| リソース追跡 | いいえ | はい (cgroups) |
| プラットフォームカバレッジ | 普遍的 | systemdのみ |
| 学習曲線 | シンプル | 中程度 |
| コンテナフレンドリー | 優秀 | 不良 |
コア機能
スケジューリング精度
Cron: 分レベル
Systemd Timer: マイクロ秒レベル
💡 Why: Systemdタイマーはマイクロ秒精度のより細かいスケジューリングをサポートしますが、cronは分レベルの粒度のみをサポートします。
リアルタイムスケジューリング
Cron: ✅ 完全サポート
Systemd Timer: ✅ 完全サポート
💡 Why: 両方とも従来の時間ベースのスケジューリングをサポートしています(例:「毎日午前3時」)。
モノトニックタイマー
Cron: ❌ 非サポート
Systemd Timer: ✅ 完全サポート
💡 Why: Systemdは起動時やその他のイベントからの経過時間に基づくタイマーをサポートしますが、cronはできません。
イベントトリガー
Cron: ❌ なし
Systemd Timer: ✅ 複数のイベント
💡 Why: Systemdはハードウェアイベント、パス変更、その他のシステムイベントでトリガーできます。
設定と管理
設定形式
Cron: Crontab(シンプル)
Systemd Timer: INIスタイルユニット
💡 Why: Cronはシンプルでよく知られたcrontab形式を使用します。Systemdはより複雑なユニットファイルを使用します。
ユーザーごとのスケジューリング
Cron: ✅ サポート
Systemd Timer: ✅ サポート
💡 Why: 両方ともユーザーごとのスケジューリングをサポートしています(ユーザーcrontabs vs systemdユーザーユニット)。
環境変数
Cron: 限定
Systemd Timer: 完全サポート
💡 Why: Systemdはサービスファイルを通じてより良い環境変数管理を提供します。
依存関係管理
Cron: ❌ なし
Systemd Timer: ✅ 完全サポート
💡 Why: Systemdタイマーはサービス、ソケット、ターゲット、その他のユニットに依存できます。
ロギングとモニタリング
組み込みロギング
Cron: メール/ログ
Systemd Timer: journald
💡 Why: Systemdはjournaldと緊密に統合され、構造化された検索可能なログを提供します。
ジョブ履歴
Cron: 限定
Systemd Timer: ✅ 追跡済み
💡 Why: Systemdはタイマートリガーとサービス結果の詳細な履歴を保持します。
リソースモニタリング
Cron: ❌ なし
Systemd Timer: ✅ cgroups
💡 Why: Systemdはcgroupsを通じて各サービスのリソース使用状況を追跡します。
失敗処理
Cron: メールのみ
Systemd Timer: 複数のオプション
💡 Why: Systemdは失敗トリガー、再起動ポリシー、依存関係ベースの反応をサポートします。
パフォーマンスとリソース
メモリ使用量
Cron: ~1-2 MB
Systemd Timer: ~5-10 MB
💡 Why: Cronデーモンは最小限のメモリを使用します。Systemdは既に実行されているため、タイマーのオーバーヘッドは無視できます。
起動時間
Cron: 高速
Systemd Timer: 即時
💡 Why: Systemdはinitの一部であり、起動時に既に実行されています。
スケーラビリティ
Cron: 良好
Systemd Timer: 優秀
💡 Why: Systemdは最新のプロセス管理で数千のユニットをより効率的に処理します。
システム統合
Cron: スタンドアロン
Systemd Timer: 統合済み
💡 Why: Systemdタイマーはsystemdベースシステムにネイティブです。
プラットフォームと互換性
Linuxサポート
Cron: ✅ 普遍的
Systemd Timer: systemdのみ
💡 Why: CronはすべてのLinuxシステムで動作します。Systemdタイマーはsystemdベースのディストリビューションでのみ動作します。
Unix/BSDサポート
Cron: ✅ はい
Systemd Timer: ❌ いいえ
💡 Why: Cronは事実上すべてのUnixライクシステムで利用可能です。
macOSサポート
Cron: ✅ launchd/cron
Systemd Timer: ❌ いいえ
💡 Why: macOSはlaunchdを使用します(systemdではない)が、cronは利用可能です。
コンテナサポート
Cron: ✅ シンプル
Systemd Timer: 複雑
💡 Why: Cronは最小限のコンテナで動作します。Systemdは完全なsystemd initが必要です。
Practical Examples
シンプルな毎日バックアップ
Cron
# 毎朝2時にバックアップを実行
0 2 * * * /root/backup.sh
この基本タスクにはCronの方がシンプルです。Systemdは2つのファイル(タイマー+サービス)が必要ですが、再起動間で永続性を提供します。
起動後15分で実行
Cron
#簡単にはサポートされていない
#@rebootとsleepが必要
Systemdは起動遅延実行をネイティブにサポートします。Cronには複雑な回避策が必要です。
ネットアップ時実行
Cron
# サポートされていない
Systemdは特定のシステム状態を待機できます。Cronには依存関係感知がありません。
Migration Guide
Cron → Systemd Timer
- → .timerと.serviceファイルの両方を作成(cronエントリ=タイマー+サービスを組み合わせたもの)
- → 時間ベースのスケジューリングにはOnCalendarを使用(cron式を変換)
- → ダウンタイム中に見逃したジョブを実行するにはPersistent=trueを使用
- → 環境変数をcrontabから[Service] Environment=に移動
- → メール出力をjournaldロギングに置き換え
- → ユーザーcrontabsをsystemdユーザーユニットに変換(~/.config/systemd/user/)
- → すべてのタイマーを表示するにはsystemctl list-timersを使用(crontab -lと類似)
Cron → Systemd Timer
- → 依存関係管理を失う - スクリプトが依存関係を処理
- → OnCalendarをcron式に変換(分 時 日 月 曜日)
- → モノトニックタイマー(OnBootSec)を@rebootとsleepに置き換え
- → イベントベースのトリガーを削除(cronは時間のみ)
- → 環境変数はcrontabまたはスクリプトへ
- → ロギングは手動で処理(syslog、カスタムファイル)
- → 組み込みの永続性なし - スクリプトで手動で最終実行を追跡
Frequently Asked Questions
新しいLinuxサーバーにはどちらを選ぶべきですか? ▼
Cronとsystemdタイマーは共存できますか? ▼
crontab -lのようにすべてのスケジュールされたタスクを表示するには? ▼
SystemdタイマーはDockerコンテナで動作しますか? ▼
Cronは非推奨ですか? ▼
Systemdタイマーはcronのように失敗時にメールを送信できますか? ▼
どちらがシステムリソースを少なく使用しますか? ▼
10秒ごとにジョブをスケジュールするには? ▼
Verdict: なし - 要件に基づいて選択
Cronとsystemdタイマーは両方とも異なるニーズを満たす強力なジョブスケジューラーです。**CronはすべてのUnixライクシステムでシンプルでポータブルなスケジューリングの普遍的な選択肢**です。**Systemdタイマーは**複雑な依存関係、イベントトリガー、統合ロギングを必要とするモダンなLinuxディストリビューションで優れています。
Recommendation
シンプルな定期タスク、クロスプラットフォーム互換性、レガシーシステム、コンテナには**cron**を使用してください。モダンなLinuxサーバー、サービスオーケストレーション、イベントドリブンスケジューリング、システムサービスとの緊密な統合が必要な場合には**systemdタイマー**を使用してください。