はじめに
24時間365日稼働する OpenClaw サービスにおいて、人手による監視だけでは現実的ではありません。サービスの状態を継続的に検出し、障害発生時に自動的に復旧し、復旧できない場合は速やかにアラートを発する——そんな自動化された健全性チェックと復旧体系が必要です。本記事では、OpenClaw の健全性チェックツールと自動再起動メカニズムを包括的に紹介します。
一、openclaw doctor 診断コマンド
1.1 基本的な使い方
openclaw doctor は OpenClaw 内蔵のワンストップ診断ツールで、サービスの各重要指標を自動的にチェックします。
openclaw doctor
出力例:
OpenClaw Doctor - 健全性診断レポート
================================
[サービス状態]
✓ OpenClaw デーモン稼働中 (PID: 12345)
✓ 稼働時間: 7d 3h 22m
✓ バージョン: 1.2.0 (最新版)
[ゲートウェイチェック]
✓ Gateway ポート 18789 アクセス可能
✓ ヘルスチェックエンドポイント応答正常 (12ms)
✓ Web Dashboard アクセス可能
[チャンネル接続]
✓ WhatsApp: 接続済み
✓ Telegram: 接続済み
⚠ Discord: 再接続中 (最終切断: 2分前)
[モデルサービス]
✓ Claude API: 利用可能 (レイテンシ: 320ms)
✓ API Key: 有効
⚠ 今月のToken使用量: 85% (クォータに近づいています)
[リソース使用状況]
✓ メモリ: 198MB / 512MB (38%)
✓ CPU: 平均 3.2%
✓ ディスク: ログディレクトリ 256MB
✓ ファイルディスクリプタ: 128 / 65536
[最近のエラー]
⚠ 過去1時間に2回のAPIタイムアウト
✓ 過去24時間に重大なエラーなし
診断結果: 概ね健全 (2件の警告)
1.2 詳細チェックモード
# すべてのチェックを実行し詳細情報を出力
openclaw doctor --verbose
# 特定モジュールのみチェック
openclaw doctor --check gateway
openclaw doctor --check channels
openclaw doctor --check model
openclaw doctor --check resources
openclaw doctor --check skills
# JSON形式で出力(スクリプト処理用)
openclaw doctor --format json
1.3 スクリプトでの使用
openclaw doctor の終了コードはスクリプトで利用できます。
| 終了コード | 意味 |
|---|---|
| 0 | すべて正常 |
| 1 | 警告ありだがサービスは利用可能 |
| 2 | 重大な問題がありサービスに影響の可能性 |
| 3 | サービス利用不可 |
#!/bin/bash
openclaw doctor --quiet
EXIT_CODE=$?
case $EXIT_CODE in
0) echo "サービス健全" ;;
1) echo "警告あり、注意が必要" ;;
2) echo "重大な問題あり、対処が必要" ;;
3) echo "サービス利用不可、緊急修復が必要!" ;;
esac
二、ヘルスチェックエンドポイント
2.1 HTTPヘルスチェック
OpenClaw Gateway は複数のヘルスチェックエンドポイントを提供しています。
# 基本的な生存確認(liveness)
curl -s http://localhost:18789/health
# {"status":"ok","uptime":604800}
# 準備完了チェック(readiness)
curl -s http://localhost:18789/health/ready
# {"status":"ready","channels":{"whatsapp":"connected","telegram":"connected"}}
# 詳細ステータス
curl -s http://localhost:18789/health/detail
2.2 カスタムヘルスチェック基準
設定でどの条件を「健全」とするかを定義できます。
// ~/.config/openclaw/openclaw.json5
{
"health": {
// 準備完了と判定するには最低1チャンネルの接続が必要
"minConnectedChannels": 1,
// この割合を超えるメモリ使用は不健全と判定
"maxMemoryPercent": 90,
// モデルAPIの連続失敗がこの値を超えると不健全と判定
"maxConsecutiveModelErrors": 5,
// ヘルスチェックタイムアウト
"timeout": 5000
}
}
三、Watchdogウォッチドッグメカニズム
3.1 OpenClaw内蔵Watchdog
OpenClaw は自身の状態を監視し異常時に自動復旧するウォッチドッグ機能を内蔵しています。
{
"watchdog": {
"enabled": true,
// チェック間隔
"interval": "60s",
// 自動再起動条件
"restartOn": {
// メモリ超過時に自動再起動
"memoryExceeded": true,
"memoryThreshold": "450MB",
// 全チャンネル切断時に自動再起動
"allChannelsDisconnected": true,
// モデル連続失敗時に自動再起動
"consecutiveModelErrors": 10,
// レスポンスタイムアウト率が高い場合に自動再起動
"timeoutRateThreshold": 0.5
},
// 再起動クールダウン(頻繁な再起動を防止)
"restartCooldown": "5m",
// 最大連続再起動回数
"maxRestarts": 3,
// 最大再起動回数超過時の動作
"onMaxRestartsExceeded": "alert" // "alert" または "stop"
}
}
3.2 外部Watchdogスクリプト
より信頼性の高い監視のため、OpenClawプロセスとは独立したウォッチドッグの使用を推奨します。
#!/bin/bash
# /usr/local/bin/openclaw-watchdog.sh
HEALTH_URL="http://localhost:18789/health"
LOG="/var/log/openclaw-watchdog.log"
MAX_FAILURES=3
FAILURE_COUNT=0
check_health() {
RESPONSE=$(curl -sf --max-time 10 "$HEALTH_URL" 2>/dev/null)
if [ $? -ne 0 ]; then
return 1
fi
STATUS=$(echo "$RESPONSE" | jq -r '.status' 2>/dev/null)
if [ "$STATUS" != "ok" ]; then
return 1
fi
return 0
}
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG"
}
if ! check_health; then
FAILURE_COUNT=$((FAILURE_COUNT + 1))
log_msg "ヘルスチェック失敗 (連続第 $FAILURE_COUNT 回)"
if [ $FAILURE_COUNT -ge $MAX_FAILURES ]; then
log_msg "連続 $MAX_FAILURES 回失敗、サービスを再起動中..."
openclaw restart
sleep 20
if check_health; then
log_msg "再起動成功、サービス復旧済み"
FAILURE_COUNT=0
else
log_msg "再起動後も利用不可、アラート通知を送信"
# アラート送信(Telegram/メール/Webhook)
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d text="OpenClaw サービスの再起動に失敗しました。手動対応が必要です!サーバー: $(hostname)"
fi
fi
else
FAILURE_COUNT=0
fi
定期実行の設定:
chmod +x /usr/local/bin/openclaw-watchdog.sh
# 2分ごとに実行
crontab -e
# */2 * * * * /usr/local/bin/openclaw-watchdog.sh
3.3 Systemd Watchdog連携
SystemdでOpenClawを管理している場合、Systemdのウォッチドッグ機能を活用できます。
# /etc/systemd/system/openclaw.service
[Service]
WatchdogSec=120 # ウォッチドッグタイムアウト:120秒
Restart=on-failure
RestartSec=10
StartLimitBurst=5
StartLimitIntervalSec=300
# ウォッチドッグタイムアウトまたはサービスクラッシュ時に実行
ExecStartPost=/usr/local/bin/openclaw-health-notify.sh start
ExecStopPost=/usr/local/bin/openclaw-health-notify.sh stop
OpenClawが定期的にSystemdにハートビートシグナルを送信する必要があります。設定で有効化してください。
{
"watchdog": {
"systemdNotify": true // systemdにウォッチドッグハートビートを自動送信
}
}
四、チャンネル自動再接続
4.1 内蔵再接続メカニズム
OpenClawは各チャンネル接続に内蔵の自動再接続ロジックを備えています。
{
"channels": {
"reconnect": {
"enabled": true,
// 初回再接続遅延
"initialDelay": "5s",
// 最大再接続遅延(指数バックオフ上限)
"maxDelay": "5m",
// 最大再接続試行回数(0=無制限)
"maxAttempts": 0,
// バックオフ係数
"backoffFactor": 2
}
}
}
再接続ログの例:
[INFO] [channel:discord] 接続切断、5s後に再接続を試行 (1/∞)
[INFO] [channel:discord] 再接続中...
[WARN] [channel:discord] 再接続失敗、10s後にリトライ (2/∞)
[INFO] [channel:discord] 再接続中...
[INFO] [channel:discord] 再接続成功、中断時間: 18s
4.2 チャンネル接続状態の監視
# すべてのチャンネルの接続状態を確認
openclaw status
# 出力
# チャンネル状態:
# WhatsApp ✓ 接続済み (uptime: 7d)
# Telegram ✓ 接続済み (uptime: 7d)
# Discord ⚠ 再接続中 (切断: 2m)
# 特定チャンネルの手動再接続
openclaw channel reconnect discord
五、アラート通知設定
5.1 内蔵アラートチャンネル
{
"alerts": {
"enabled": true,
// アラート方式
"channels": [
{
"type": "telegram",
"botToken": "YOUR_BOT_TOKEN",
"chatId": "YOUR_CHAT_ID"
},
{
"type": "email",
"smtp": {
"host": "smtp.example.com",
"port": 587,
"user": "[email protected]",
"pass": "password"
},
"to": "[email protected]"
},
{
"type": "webhook",
"url": "https://hooks.slack.com/services/xxx"
}
],
// アラートトリガー条件
"rules": {
"serviceDown": true,
"channelDisconnected": true,
"highMemory": true,
"highErrorRate": true,
"certificateExpiring": true
}
}
}
5.2 アラートの抑制
短時間内に大量の重複アラートが送信されるのを防止します。
{
"alerts": {
// 同一タイプのアラートの最小間隔
"throttle": "15m",
// 復旧通知
"notifyOnRecover": true
}
}
六、ヘルスチェックのベストプラクティス
- 多層チェック:内蔵watchdog + 外部cronスクリプト + Uptime Kumaで多重保証
- 適切な間隔:ヘルスチェックは頻繁すぎないよう、1-2分に1回程度が適切
- 段階的復旧:まずチャンネル再接続を試み、次にサービス再起動、最後に手動アラートを送信
- クールダウン期間:再起動クールダウンを設定し、「障害検出→再起動→再障害→再起動」の無限ループを防止
- 定期的な訓練:意図的に障害をシミュレート(例:
kill -9)し、自動復旧メカニズムが有効であることを検証 - ログの保存:watchdogスクリプトの操作ログを独立して保存し、事後分析に活用
信頼性の高いヘルスチェックと自動復旧メカニズムにより、OpenClawサービスのアップタイムを99.9%に近づけ、手動運用の負担を大幅に軽減できます。