🕰️ chronsync - Lightweight Task Scheduler Daemon
chronsyncは、Chrono (時間) + cron + sync (同期) から名付けられました。 chronsyncは、Rustで構築された超軽量なCLIタスクスケジューラー(デーモン)です。 JSON設定ファイルに基づき、cronライクなスケジュールで外部コマンドを永続的に実行します。 設定ファイルの変更を即座に検知し、実行中のタスクを停止・再構築(リロード)するホットリロード機能を備えています。
✨ 特徴
- 🛡️ 堅牢な設計: Rustの非同期ランタイム
tokioを採用し、安定した長時間稼働を実現。 - 🔄 ホットリロード: 設定ファイル(
config.json)の変更をリアルタイムで監視。サービスを再起動することなく、保存と同時にタスク定義を更新します。 - ⏰ 詳細なスケジューリング: 秒単位を含む Cron形式 で、精密な実行時刻の指定が可能。
- 🚀 高パフォーマンス: シングルバイナリで動作し、リソース消費を最小限に抑えます。
- 💻 クロスプラットフォーム: Linux, macOS, Windows でのサービス登録をサポート。
📦 インストールとビルド
ソースコードからビルドしてインストールします。
# リポジトリのクローン
# ローカルへのインストール (パスが通った場所にバイナリが配置されます)
⚙️ 設定ファイル (config.json)
chronsyncの動作には設定ファイルが必須です。 アプリケーションは起動時に標準的な設定ディレクトリ(XDG Base Directoryなど)を検索します。
設定ファイルの配置場所
設定ディレクトリに config.json を作成してください。
便利な init コマンドでひな形を作成することもできます。
| OS | パス |
|---|---|
| Linux / macOS | ~/.config/chronsync/config.json |
💡 ヒント: 初回起動時に設定ファイルが見つからない場合、chronsyncは検索したパスをエラーログに出力して終了します。そのパスを参考にファイルを配置してください。
設定フォーマット
JSON形式で tasks 配列を定義します。
- name: タスクの識別子(ログ出力に使用)。
- cron_schedule: cron形式のスケジュール文字列(秒 分 時 日 月 曜日 年)。
- 例:
*/1 * * * * *(毎秒),0 30 9 * * *(毎日9:30:00)
- 例:
- command: 実行するコマンドのパス。
- args: コマンドへの引数の配列。
- 注意: パイプ
|やリダイレクト>、環境変数展開$VARを使用したい場合は、commandにシェル(/bin/shや/bin/bash)を指定し、argsで"-c"とコマンド文字列を渡してください。
- 注意: パイプ
🚀 実行方法
手動実行 (開発・テスト)
# コンパイルして実行
# またはインストール済みなら
常駐サービスとして登録 (推奨)
chronsync はサービス管理機能を内蔵しており、コマンド一つで常駐サービス(デーモン)として登録・管理できます。
Linux (Systemd), macOS (Launchd), Windows (Service) に対応しています。
--user (グローバルオプション): ユーザーサービスとして操作
chronsync の service コマンドは、デフォルトではシステムレベルのサービス(通常 sudo が必要)として操作しようとします。
現在のユーザーの権限でサービスを管理したい場合は、--user グローバルオプションを付けてください。
# システムサービスとしてインストール (sudo が必要)
# ユーザーサービスとしてインストール (sudo 不要)
1. サービスのインストール (登録)
自動起動の設定も行われます。
# システムサービスとしてインストール (sudo が必要)
# ユーザーサービスとしてインストール (sudo 不要)
2. サービスの開始
インストール後、サービスを開始します。
# システムサービス
# ユーザーサービス
その他のコマンド
- 停止:
chronsync --user service stop(ユーザーサービスの場合) またはsudo chronsync service stop(システムサービスの場合) - アンインストール:
chronsync --user service uninstall(ユーザーサービスの場合) またはsudo chronsync service uninstall(システムサービスの場合)
ログの確認 (Linux - Systemd)
サービスのログは、journalctl コマンドを使う代わりに、chronsync service log コマンドで簡単に確認できます。
# システムサービスのログを表示 (デフォルト20行、リアルタイム監視)
# ユーザーサービスのログを表示 (デフォルト20行、リアルタイム監視)
# システムサービスの最新100行を表示
# ユーザーサービスの最新50行を表示
Systemd ユーザーサービスとして手動登録 (Linux)
手動で細かく設定したい場合は、以下の手順で Systemd に登録できます。
-
ユニットファイルの作成
~/.config/systemd/user/chronsync.serviceを作成します(ディレクトリがない場合は作成してください)。[Unit] Description=chronsync Task Scheduler After=network.target [Service] # cargo installでインストールしたバイナリのパスを指定 # "which chronsync" コマンドで確認できます (例: /home/ユーザー名/.cargo/bin/chronsync) ExecStart=%h/.cargo/bin/chronsync run # 常に再起動 Restart=always RestartSec=5s # ログ出力設定 StandardOutput=journal StandardError=journal [Install] WantedBy=default.target -
サービスの有効化と起動
# 設定の再読み込み # サービスの起動 # 自動起動の有効化 -
ログの確認
📂 プロジェクト構成
.
├── src/
│ ├── main.rs # エントリーポイント
│ ├── commands.rs # 各コマンドのハンドラ
│ ├── cli.rs # CLI引数の定義
│ ├── config.rs # 設定ファイルの定義と読み込みロジック
│ ├── scheduler.rs # タスクのスケジューリングと実行管理
│ ├── watcher.rs # 設定ファイルの変更監視
│ └── utils.rs # ユーティリティ
├── config.json # 設定ファイルのサンプル
└── Cargo.toml # 依存関係定義