9 分で読了 #homelab
このページの目次

定期タスクと自動スケジューリング

すべてのカスタム定期タスクは systemd timer を統一して使用し、cron は使用しない。cron より優れている点:ログが journald に集約され一元検索可能、依存チェーン(After/Wants)、ランダム遅延によるスラーム効果、失敗時のリトライ機構、systemctl list-timers で全体を一目で把握可能。本記事は頻度別にグループ化:高頻度(秒単位の収集と自己修復)→日次(同期と収集)→月次(証明書)→常駐型(長期のヘルスチェック)。

一、高頻度(≤5分):秒単位の収集と自己修復

これらの timer はリアルタイムメトリクスの収集と障害時の自動復旧を担当し、node_exporter textfile collector → Prometheus に出力する。これらが停止すると、監視データの欠落やネットワーク断線を引き起こす。

amdgpu-metrics(10秒ごと)

GPU の温度/消費電力/周波数を収集する。

[Timer]
OnBootSec=15s
OnUnitActiveSec=10s

net-metrics(15秒ごと)

WiFi 信号強度/リンク品質 + プロキシ遅延プローブを収集する。

rathole-probe(30秒ごと)

rathole で公開されているすべてのサービスに対して TCP/TLS/HTTP のヘルスチェックを実行し、rathole_service_up gauge を出力する。このメトリクスは Grafana の rathole アラートルールを駆動している(monitoring.md参照)。

プローブ対象:
  TCP: 中継 VPS :2333(rathole 制御チャネル)
  HTTPS: derp / grafana / chat / doc / paste / caldav / owntracks
→ rathole_service_up{service="doc"} 1/0

owntracks-collector(30秒ごと)

ローカルの OwnTracks Recorder API から家族の GPS 位置、バッテリー残量、精度を取得し、textfile collector に出力する。

wifi-watchdog(30秒ごと)

ゲートウェイ .1 に対して ping を実行し、連続失敗時に段階的な自己修復を行う:再接続→RF 初期化→ドライバー再読み込み。詳細は network-recovery.md を参照。

[Timer]
OnBootSec=60s
OnUnitActiveSec=30s

llama-gpu-sync(15秒ごと)

GPU の実際の負荷に基づいて消費電力モードを切り替える:busy≥50%→COMPUTE(モード5)、アイドル>90s→BOOTUP_DEFAULT(モード0)。ユーザーレベルの timer。詳細は local-llm.md を参照。

# ~/.config/systemd/user/llama-gpu-sync.timer
[Timer]
OnBootSec=15s
OnUnitActiveSec=15s

二、日次:同期と収集

深夜のオフピーク時間帯に実行し、CPU/ネットワーク/N100 の書き込み競合を避ける。

sync-subscribe(03:30)

真のソース mihomo config を取得し、ローカル環境からの依存を排除して消毒後、rsync で中継 VPS に同期する。clash.yaml + sub.txt(v2rayN base64) を出力し、モバイル端末のローミングインポートに使用する。

sync-mihomo-to-router(03:45)

真のソースから proxies/groups/rules の3つのセクションを抽出し、N100 の Nikki profile に適用する。両端で検証 + バックアップ + 失敗時の自動ロールバックを行う。サブスクリプションとの書き込み競合を避けるため、15分ずらして実行する。

上記2つについては network-architecture.md の構成派生パイプラインを参照。

backup-system(04:00、ランダム遅延10分)

システムディスクの rsync インクリメンタルバックアップを tank/backup/system + ZFS スナップショットに実行し、30世代保持する。アイドル IO 優先度、Persistent=true により見逃し分は後で補完実行される。詳細は system-backup.md を参照。

eix-sync(06:31)

Gentoo eix データベースの同期。標準的なシステム timer、Portage インストール時に付属。

sgcc-collector(08:00、ランダム遅延10分)

国网(国家電網)の電気料金データを収集し、textfile collector → Prometheus に出力する。環境変数は /etc/default/sgcc-collector に設定。

llm-job@daily-harvest(23:50)

夜間に当日の Claude Code セッション + openclaw のメモリから、ローカルモデルを使用して map-reduce で「実際に完了した作業」を抽出し、当日の ~/doc/daily/ に冪等性を持って追加する。これは「完了した作業が doc-daily-log に記録されていない」という根本的な網羅性問題を解決する。llm-jobs 框架 に属する。

llm-job@daily-report(09:00)

毎日のサマリー(天気、作業ログの要約、都市)を WeChat にプッシュする。昨日の ~/doc/daily/(daily-harvest によって補完済み)を読み取り、ローカルモデルで重複排除して人間が理解しやすい文章にグループ化してから配信する。モデルが利用不可の場合は元のグループ化に戻す。都市情報は ~/.current-city(iOS ショートカット/openclaw によって管理)から取得する。llm-jobs 框架 に属し、テンプレートユニットは llm-job@.service。⁠ daily-report-weixin.timer(無効化済み、スクリプトはリカバリ用に保持)を置換する。

三、月次

acme-renew(毎月20日 03:00)

acme.sh DNS-01(AliDNS)を使用して *.liz6.com のワイルドカード証明書を自動更新し、DERP サーバーにデプロイする。プロキシ 127.0.0.1:7890 を経由する(ACME リクエストは国外へのアクセスが必要)。

四、常駐型:長期のヘルスチェック

rathole-watchdog(5分ごと)

doc トンネルのヘルスエンドポイントをプローブし、連続3回失敗時に docker restart rathole-client を実行して、ジッターによる誤検知を防ぐ。詳細は rathole-tunnel.md を参照。

# ~/.config/systemd/user/rathole-watchdog.timer
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min

五、標準システムタスク(cron)

システム付属のもののみで、カスタム cron タスクは存在しない:

タスクパス頻度
man-db/etc/cron.daily/毎日
smartmontools-update-drivedb/etc/cron.monthly/毎月

関連ドキュメント