AI-TOL
⚖️ Comparison 📊 Updated 2026-05-27

Cron

クラシックUnixジョブスケジューラー

VS
⚙️

Systemd Timer

モダンサービスベーススケジューラー

CronとSystemd Timerスケジューラーの包括的な比較。いつ使用するか、機能、長所と短所、および移行方法を学びます。

Quick Comparison

Feature
Cron
⚙️ Systemd Timer
スケジューリングスタイル 時間ベースのみ 時間またはイベントベース
粒度 マイクロ秒
依存関係 なし 完全サポート
ロギング 基本メール/ログ journald統合
ユーザーごとのジョブ はい はい
モノトニックタイマー いいえ はい
リソース追跡 いいえ はい (cgroups)
プラットフォームカバレッジ 普遍的 systemdのみ
学習曲線 シンプル 中程度
コンテナフレンドリー 優秀 不良

コア機能

スケジューリング精度

Systemd Timer Wins

Cron: 分レベル

⚙️

Systemd Timer: マイクロ秒レベル

💡 Why: Systemdタイマーはマイクロ秒精度のより細かいスケジューリングをサポートしますが、cronは分レベルの粒度のみをサポートします。

リアルタイムスケジューリング

Tie

Cron: ✅ 完全サポート

⚙️

Systemd Timer: ✅ 完全サポート

💡 Why: 両方とも従来の時間ベースのスケジューリングをサポートしています(例:「毎日午前3時」)。

モノトニックタイマー

Systemd Timer Wins

Cron: ❌ 非サポート

⚙️

Systemd Timer: ✅ 完全サポート

💡 Why: Systemdは起動時やその他のイベントからの経過時間に基づくタイマーをサポートしますが、cronはできません。

イベントトリガー

Systemd Timer Wins

Cron: ❌ なし

⚙️

Systemd Timer: ✅ 複数のイベント

💡 Why: Systemdはハードウェアイベント、パス変更、その他のシステムイベントでトリガーできます。

設定と管理

設定形式

Cron Wins

Cron: Crontab(シンプル)

⚙️

Systemd Timer: INIスタイルユニット

💡 Why: Cronはシンプルでよく知られたcrontab形式を使用します。Systemdはより複雑なユニットファイルを使用します。

ユーザーごとのスケジューリング

Tie

Cron: ✅ サポート

⚙️

Systemd Timer: ✅ サポート

💡 Why: 両方ともユーザーごとのスケジューリングをサポートしています(ユーザーcrontabs vs systemdユーザーユニット)。

環境変数

Systemd Timer Wins

Cron: 限定

⚙️

Systemd Timer: 完全サポート

💡 Why: Systemdはサービスファイルを通じてより良い環境変数管理を提供します。

依存関係管理

Systemd Timer Wins

Cron: ❌ なし

⚙️

Systemd Timer: ✅ 完全サポート

💡 Why: Systemdタイマーはサービス、ソケット、ターゲット、その他のユニットに依存できます。

ロギングとモニタリング

組み込みロギング

Systemd Timer Wins

Cron: メール/ログ

⚙️

Systemd Timer: journald

💡 Why: Systemdはjournaldと緊密に統合され、構造化された検索可能なログを提供します。

ジョブ履歴

Systemd Timer Wins

Cron: 限定

⚙️

Systemd Timer: ✅ 追跡済み

💡 Why: Systemdはタイマートリガーとサービス結果の詳細な履歴を保持します。

リソースモニタリング

Systemd Timer Wins

Cron: ❌ なし

⚙️

Systemd Timer: ✅ cgroups

💡 Why: Systemdはcgroupsを通じて各サービスのリソース使用状況を追跡します。

失敗処理

Systemd Timer Wins

Cron: メールのみ

⚙️

Systemd Timer: 複数のオプション

💡 Why: Systemdは失敗トリガー、再起動ポリシー、依存関係ベースの反応をサポートします。

パフォーマンスとリソース

メモリ使用量

Cron Wins

Cron: ~1-2 MB

⚙️

Systemd Timer: ~5-10 MB

💡 Why: Cronデーモンは最小限のメモリを使用します。Systemdは既に実行されているため、タイマーのオーバーヘッドは無視できます。

起動時間

Systemd Timer Wins

Cron: 高速

⚙️

Systemd Timer: 即時

💡 Why: Systemdはinitの一部であり、起動時に既に実行されています。

スケーラビリティ

Systemd Timer Wins

Cron: 良好

⚙️

Systemd Timer: 優秀

💡 Why: Systemdは最新のプロセス管理で数千のユニットをより効率的に処理します。

システム統合

Systemd Timer Wins

Cron: スタンドアロン

⚙️

Systemd Timer: 統合済み

💡 Why: Systemdタイマーはsystemdベースシステムにネイティブです。

プラットフォームと互換性

Linuxサポート

Cron Wins

Cron: ✅ 普遍的

⚙️

Systemd Timer: systemdのみ

💡 Why: CronはすべてのLinuxシステムで動作します。Systemdタイマーはsystemdベースのディストリビューションでのみ動作します。

Unix/BSDサポート

Cron Wins

Cron: ✅ はい

⚙️

Systemd Timer: ❌ いいえ

💡 Why: Cronは事実上すべてのUnixライクシステムで利用可能です。

macOSサポート

Cron Wins

Cron: ✅ launchd/cron

⚙️

Systemd Timer: ❌ いいえ

💡 Why: macOSはlaunchdを使用します(systemdではない)が、cronは利用可能です。

コンテナサポート

Cron Wins

Cron: ✅ シンプル

⚙️

Systemd Timer: 複雑

💡 Why: Cronは最小限のコンテナで動作します。Systemdは完全なsystemd initが必要です。

Practical Examples

シンプルな毎日バックアップ

Cron

                    # 毎朝2時にバックアップを実行
0 2 * * * /root/backup.sh
                  
[Unit] Description=毎日バックアップ [Timer] OnCalendar=*-*-* 02:00:00 Persistent=true [Install] WantedBy=timers.target

この基本タスクにはCronの方がシンプルです。Systemdは2つのファイル(タイマー+サービス)が必要ですが、再起動間で永続性を提供します。

起動後15分で実行

Cron

                    #簡単にはサポートされていない
#@rebootとsleepが必要
                  
[Timer] OnBootSec=15min [Service] ExecStart=/usr/local/bin/startup-task.sh

Systemdは起動遅延実行をネイティブにサポートします。Cronには複雑な回避策が必要です。

ネットアップ時実行

Cron

                    # サポートされていない
                  
[Unit] After=network-online.target Wants=network-online.target [Timer] OnBootSec=0 [Service] ExecStart=/usr/bin/update-app

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サーバーにはどちらを選ぶべきですか?
モダンなsystemdベースのディストリビューション(RHEL 7+、Ubuntu 15.04+など)では、移植性が必要でない限りsystemdタイマーを優先します。より良いロギング、依存関係、統合を提供します。クロスプラットフォーム互換性が必要な場合や最小限のコンテナで作業する場合のみcronを使用してください。
Cronとsystemdタイマーは共存できますか?
はい!同じシステムでcronとsystemdタイマーの両方を実行できます。多くのディストリビューションに両方が含まれています。ただし、競合を避けるために両方で同じジョブをスケジュールしないでください。
crontab -lのようにすべてのスケジュールされたタスクを表示するには?
systemdの場合、`systemctl list-timers --all`を使用してすべてのタイマーを表示します。ユーザータイマーの場合、`--user`を追加します。これにより、次回トリガー時間を含むcrontab -lと同様の情報が表示されます。
SystemdタイマーはDockerコンテナで動作しますか?
一般的にいいえ。SystemdタイマーにはPID 1としてのsystemdが必要ですが、ほとんどのDockerコンテナはsystemdを実行していません。コンテナの場合は、cronや外部スケジューラー(Kubernetes CronJobs、AWS EventBridgeなど)を使用してください。
Cronは非推奨ですか?
いいえ。Cronはまだ積極的に保守されており、すべての主要なディストリビューションに含まれています。Systemdタイマーは代替手段であり、置き換えではありません。Cronは非systemdシステムとポータブルスクリプトにとって依然として重要です。
Systemdタイマーはcronのように失敗時にメールを送信できますか?
ネイティブにはできません。Systemdはjournaldロギングに依存しています。ただし、`OnFailure=`ディレクティブを設定してメールを送信するスクリプトをトリガーしたり、ジャーナルログを監視するモニタリングツールを使用したりできます。
どちらがシステムリソースを少なく使用しますか?
Cronデーモンは約1-2 MBのRAMを使用します。Systemdは既にinitとして実行されているため、タイマーのオーバーヘッドは無視できます。現代のシステムでは差はわずかです。リソース使用ではなく機能に基づいて選択してください。
10秒ごとにジョブをスケジュールするには?
Cronもsystemdもこれには理想的ではありません。Cronは分レベルの粒度のみをサポートします。Systemdは理論的にはマイクロ秒精度をサポートしていますが、推奨されません。サブ分間隔にはシンプルなループスクリプト、スーパーバイザー、またはアプリケーションレベルのスケジューラーを使用してください。

Verdict: なし - 要件に基づいて選択

Cronとsystemdタイマーは両方とも異なるニーズを満たす強力なジョブスケジューラーです。**CronはすべてのUnixライクシステムでシンプルでポータブルなスケジューリングの普遍的な選択肢**です。**Systemdタイマーは**複雑な依存関係、イベントトリガー、統合ロギングを必要とするモダンなLinuxディストリビューションで優れています。

Recommendation

シンプルな定期タスク、クロスプラットフォーム互換性、レガシーシステム、コンテナには**cron**を使用してください。モダンなLinuxサーバー、サービスオーケストレーション、イベントドリブンスケジューリング、システムサービスとの緊密な統合が必要な場合には**systemdタイマー**を使用してください。

Related Resources