---
title: Scheduled Tasks and Automated Scheduling
url: https://doc.liz6.com/en/homelab/timers-and-crons
locale: en
area: homelab
tags:
- homelab
date: 2026-07-01
modified: 2026-07-16
description: 'All custom scheduled tasks use systemd timers exclusively, avoiding cron. Advantages over cron include: unified log retrieval via journald, dependency chains (After/Wants), random delays to prevent thundering herd, failure retry mechanisms, and a global overview via `systemctl list-timers`. This document is grouped by frequency: high-frequency (second-level collection and self-healing) → daily (sync and collection) → monthly (certificates)…'
---

# Scheduled Tasks and Automated Scheduling

> All custom scheduled tasks use systemd timers exclusively, avoiding cron. Advantages over cron include: unified log retrieval via journald, dependency chains (After/Wants), random delays to prevent thundering herd, failure retry mechanisms, and a global overview via `systemctl list-timers`. This document is grouped by frequency: high-frequency (second-level collection and self-healing) → daily (sync and collection) → monthly (certificates) → daemon-type (long-cycle health checks).

## 1. High-Frequency (≤5 minutes): Second-Level Collection and Self-Healing

These timers are responsible for real-time metric collection and automatic fault recovery. Output goes to the node_exporter textfile collector → Prometheus. If they fail, monitoring data is lost or network connectivity is broken.

### amdgpu-metrics (every 10s)

Collects GPU temperature, power consumption, and frequency.

```ini
[Timer]
OnBootSec=15s
OnUnitActiveSec=10s
```

### net-metrics (every 15s)

Collects WiFi signal strength/link quality + proxy latency probes.

### rathole-probe (every 30s)

Performs TCP/TLS/HTTP health checks on all services exposed via rathole, outputting the `rathole_service_up` gauge. This metric drives Grafana's rathole alerting rules (see [monitoring.md](monitoring.md)).

```
Health check targets:
  TCP: Transit VPS :2333 (rathole control channel)
  HTTPS: derp / grafana / chat / doc / paste / caldav / owntracks
→ rathole_service_up{service="doc"} 1/0
```

### owntracks-collector (every 30s)

Pulls family members' GPS locations, battery levels, and accuracy from the local OwnTracks Recorder API → textfile collector.

### wifi-watchdog (every 30s)

Pings gateway `.1`. Implements layered self-healing for consecutive failures: reconnect → RF reset → driver reload. See [network-recovery.md](network-recovery.md) for details.

```ini
[Timer]
OnBootSec=60s
OnUnitActiveSec=30s
```

### llama-gpu-sync (every 15s)

Switches power profiles based on actual GPU load: busy≥50% → COMPUTE (profile 5), idle>90s → BOOTUP_DEFAULT (profile 0). User-level timer. See [local-llm.md](local-llm.md) for details.

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

## 2. Daily: Sync and Collection

Executed during off-peak hours to avoid competing for CPU/network/N100 write resources.

### sync-subscribe (03:30)

True source mihomo config → de-hostname sanitization → rsync to transit VPS, outputting `clash.yaml` + `sub.txt` (v2rayN base64) for mobile roaming import.

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

Extracts true source proxies/groups/rules into three segments → N100 Nikki profile, with dual-end validation + backup + automatic rollback on failure. Staggered 15 minutes from subscription sync to avoid simultaneous writes to N100.

> See [network-architecture.md](network-architecture.md) for configuration derivation pipeline details.

### backup-system (04:00, random delay 10min)

Incremental rsync of system disk to `tank/backup/system` + ZFS snapshots, retaining 30 versions. Idle IO priority, `Persistent=true` for missed runs. See [system-backup.md](system-backup.md) for details.

### eix-sync (06:31)

Gentoo eix database sync. Standard system timer, included with Portage installation.

### sgcc-collector (08:00, random delay 10min)

Collects State Grid electricity data → textfile collector → Prometheus. Environment variables in `/etc/default/sgcc-collector`.

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

At night, uses a local model to map-reduce and extract "actual completed work" from that day's Claude Code sessions + openclaw memories, idempotently adding to `~/doc/daily/`. Addresses the systemic issue of "tasks completed but not recorded by `doc-daily-log`". Part of the [llm-jobs framework](local-llm-usage.md).

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

Daily summary (weather, work log summary, city) pushed to WeChat. Reads yesterday's `~/doc/daily/` (already populated by daily-harvest), deduplicates and groups into human-readable text via local model before delivery; falls back to original grouping if the model is unavailable. City read from `~/.current-city` (maintained by iOS Shortcuts/openclaw). Part of the [llm-jobs framework](local-llm-usage.md), template unit `llm-job@.service`. **Replaces** the old `daily-report-weixin.timer` (deprecated, script retained as fallback).

## 3. Monthly

### acme-renew (20th of each month at 03:00)

acme.sh DNS-01 (AliDNS) automatic renewal of `*.liz6.com` wildcard certificates, deployed to the DERP server. Uses proxy `127.0.0.1:7890` (ACME requests require international connectivity).

## 4. Daemon-Type: Long-Cycle Health Checks

### rathole-watchdog (every 5min)

Checks doc tunnel health endpoints. On 3 consecutive failures, executes `docker restart rathole-client`, with jitter prevention to avoid false positives. See [rathole-tunnel.md](rathole-tunnel.md) for details.

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

## 5. Standard System Tasks (cron)

Only system-provided tasks exist; no custom cron tasks:

| Task | Path | Frequency |
|------|------|-----------|
| man-db | `/etc/cron.daily/` | Daily |
| smartmontools-update-drivedb | `/etc/cron.monthly/` | Monthly |

## Related Documentation

- [network-architecture.md](network-architecture.md) — Configuration derivation pipeline + daemons
- [rathole-tunnel.md](rathole-tunnel.md) — Tunnel daemons
- [local-llm.md](local-llm.md) — GPU power scheduling
- [network-recovery.md](network-recovery.md) — WiFi self-healing strategies
- [system-backup.md](system-backup.md) — System disk backup and recovery
- [monitoring.md](monitoring.md) — Monitoring architecture (rathole-probe metrics drive Grafana alerts)
- [software.md](software.md) — Software stack inventory
