Skip to content

coil398/chronsync

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🕰️ chronsync - Lightweight Task Scheduler Daemon

chronsyncは、Chrono (時間) + cron + sync (同期) から名付けられました。 chronsyncは、Rustで構築された超軽量なCLIタスクスケジューラー(デーモン)です。 JSON設定ファイルに基づき、cronライクなスケジュールで外部コマンドを永続的に実行します。 設定ファイルの変更を即座に検知し、実行中のタスクを停止・再構築(リロード)するホットリロード機能を備えています。

✨ 特徴

  • 🛡️ 堅牢な設計: Rustの非同期ランタイム tokio を採用し、安定した長時間稼働を実現。
  • 🔄 ホットリロード: 設定ファイル(config.json)の変更をリアルタイムで監視。サービスを再起動することなく、保存と同時にタスク定義を更新します。
  • ⏰ 詳細なスケジューリング: 秒単位を含む Cron形式 で、精密な実行時刻の指定が可能。
  • 🚀 高パフォーマンス: シングルバイナリで動作し、リソース消費を最小限に抑えます。
  • 💻 クロスプラットフォーム: Linux, macOS, Windows でのサービス登録をサポート。

📦 インストールとビルド

ソースコードからビルドしてインストールします。

# リポジトリのクローン
git clone https://github.com/coil398/chronsync.git
cd chronsync

# ローカルへのインストール (パスが通った場所にバイナリが配置されます)
car go install --path .

⚙️ 設定ファイル (config.json)

chronsyncの動作には設定ファイルが必須です。 アプリケーションは起動時に標準的な設定ディレクトリ(XDG Base Directoryなど)を検索します。

設定ファイルの配置場所

設定ディレクトリに config.json を作成してください。 便利な init コマンドでひな形を作成することもできます。

chronsync init
OS パス
Linux / macOS ~/.config/chronsync/config.json

💡 ヒント: 初回起動時に設定ファイルが見つからない場合、chronsyncは検索したパスをエラーログに出力して終了します。そのパスを参考にファイルを配置してください。

設定フォーマット

JSON形式で tasks 配列を定義します。

{
  "tasks": [
    {
      "name": "ping_test",
      "cron_schedule": "*/5 * * * * *", 
      "command": "/bin/echo",
      "args": ["Hello World"],
      "timeout": 10,
      "cwd": "/tmp",
      "env": {
        "MY_VAR": "value"
      }
    },
    {
      "name": "shell_script_example",
      "cron_schedule": "0 0 * * * *", 
      "command": "/bin/sh",
      "args": [
        "-c",
        "/bin/echo \"Current date is $(date)\""
      ]
    }
  ]
}
  • name: タスクの識別子(ログ出力に使用)。
  • cron_schedule: cron形式のスケジュール文字列(秒 分 時 日 月 曜日 年)。
    • 例: */1 * * * * * (毎秒), 0 30 9 * * * (毎日9:30:00)
  • command: 実行するコマンドのパス。
  • args: コマンドへの引数の配列。
    • 注意: パイプ | やリダイレクト >、環境変数展開 $VAR を使用したい場合は、command にシェル(/bin/sh/bin/bash)を指定し、args"-c" とコマンド文字列を渡してください。
  • timeout (オプション): コマンド実行のタイムアウト(秒)。指定時間を超えるとプロセスはキルされます。
  • webhook_url (オプション): コマンド失敗時にエラー通知を送信するWebhook URL(Discord, Slack互換のJSONペイロード)。
  • cwd (オプション): コマンド実行時のカレントディレクトリ。
  • env (オプション): コマンド実行時に設定する環境変数のマップ。

🛠️ その他の便利コマンド

  • chronsync init: 設定ファイルのひな形を作成します。
  • chronsync check: 設定ファイルの構文チェックを行います。
  • chronsync edit: 設定ファイルを $EDITOR で開き、保存時に自動チェックを行います。
  • chronsync list: 登録されているタスクの一覧を表示します。
  • chronsync exec <TASK_NAME>: 特定のタスクを即座に手動実行します(デバッグ用)。
    • 例: chronsync exec ping_test

🚀 実行方法

手動実行 (開発・テスト)

# コンパイルして実行
car go run -- run
# またはインストール済みなら
chronsync run

常駐サービスとして登録 (推奨)

chronsync はサービス管理機能を内蔵しており、コマンド一つで常駐サービス(デーモン)として登録・管理できます。 Linux (Systemd), macOS (Launchd), Windows (Service) に対応しています。

--user (グローバルオプション): ユーザーサービスとして操作

chronsyncservice コマンドは、デフォルトではシステムレベルのサービス(通常 sudo が必要)として操作しようとします。 現在のユーザーの権限でサービスを管理したい場合は、--user グローバルオプションを付けてください。

# システムサービスとしてインストール (sudo が必要)
sudo chronsync service install

# ユーザーサービスとしてインストール (sudo 不要)
chronsync --user service install

1. サービスのインストール (登録)

自動起動の設定も行われます。

# システムサービスとしてインストール (sudo が必要)
sudo chronsync service install

# ユーザーサービスとしてインストール (sudo 不要)
chronsync --user service install

2. サービスの開始

インストール後、サービスを開始します。

# システムサービス
sudo chronsync service start

# ユーザーサービス
chronsync --user service start

その他のコマンド

  • 停止: chronsync --user service stop (ユーザーサービスの場合) または sudo chronsync service stop (システムサービスの場合)
  • アンインストール: chronsync --user service uninstall (ユーザーサービスの場合) または sudo chronsync service uninstall (システムサービスの場合)

ログの確認 (Linux - Systemd)

サービスのログは、journalctl コマンドを使う代わりに、chronsync service log コマンドで簡単に確認できます。

# システムサービスのログを表示 (デフォルト20行、リアルタイム監視)
sudo chronsync service log -f

# ユーザーサービスのログを表示 (デフォルト20行、リアルタイム監視)
chronsync --user service log -f

# システムサービスの最新100行を表示
sudo chronsync service log -n 100

# ユーザーサービスの最新50行を表示
chronsync --user service log -n 50

Systemd ユーザーサービスとして手動登録 (Linux)

手動で細かく設定したい場合は、以下の手順で Systemd に登録できます。

  1. ユニットファイルの作成 ~/.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
  2. サービスの有効化と起動

    # 設定の再読み込み
    systemctl --user daemon-reload
    
    # サービスの起動
    systemctl --user start chronsync
    
    # 自動起動の有効化
    systemctl --user enable chronsync
  3. ログの確認

    journalctl --user -u chronsync -f

📂 プロジェクト構成

.
├── src/
│   ├── main.rs       # エントリーポイント
│   ├── commands.rs   # 各コマンドのハンドラ
│   ├── cli.rs        # CLI引数の定義
│   ├── config.rs     # 設定ファイルの定義と読み込みロジック
│   ├── scheduler.rs  # タスクのスケジューリングと実行管理
│   ├── watcher.rs    # 設定ファイルの変更監視
│   └── utils.rs      # ユーティリティ
├── config.json       # 設定ファイルのサンプル
└── Cargo.toml        # 依存関係定義

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages