fix(PROJ-58): Lockfile gegen überlappende Cron-Batch-Läufe + update.sh synct Cron-Dateien

Root Cause für ausbleibende Lastsenkung: update.sh hat /etc/cron.d/archivmail
nie auf den Server kopiert, daher fehlten die PROJ-58-Cronzeilen trotz
aktivem batch_mode komplett. Jetzt kopiert update.sh die Cron-Datei und alle
Wrapper-Skripte bei jedem Deploy automatisch ein.

Zusätzlich: Wrapper-Skripte (analog mailpiler indexer.delta.sh) verhindern
per Lockfile, dass sich Cron-Läufe bei großem Backlog überlappen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-06-24 23:54:37 +02:00
co-authored by Claude Sonnet 4.6
parent c91eeac0a0
commit 46502abe75
5 changed files with 70 additions and 2 deletions
+9 -2
View File
@@ -46,15 +46,22 @@
# dauerhaft und arbeitet alles sofort ab. Wer batch_mode nicht nutzt, kann
# die beiden Zeilen einfach auskommentiert lassen.
#
# Die Jobs rufen Wrapper-Skripte auf (archivmail-index-pending.sh /
# archivmail-ocr-reprocess.sh), die per PID-Lockfile unter /var/run/archivmail/
# überlappende Läufe verhindern — analog zum mailpiler-Vorbild
# (indexer.delta.sh mit MAINTMPFILE/DELTATMPFILE). Ohne diesen Schutz könnte
# ein Lauf mit großem Backlog länger dauern als das Intervall und sich mit
# dem nächsten Tick überlappen, was die Last-Glättung wieder aufheben würde.
#
# Anpassen: Intervall/Uhrzeiten unten nach Bedarf ändern (crontab-Syntax).
# Die beiden Jobs sind bewusst leicht versetzt, damit Index- und OCR-Lauf
# nicht exakt zeitgleich starten.
# Index-Backlog (indexed_at IS NULL) alle 15 Minuten verarbeiten
*/15 * * * * root /opt/archivmail/archivmail index-pending --config /etc/archivmail/config.yml --limit 500 >> /var/log/archivmail/index-pending.log 2>&1
*/15 * * * * root /usr/local/bin/archivmail-index-pending.sh >> /var/log/archivmail/index-pending.log 2>&1
# OCR-Backlog (ocr_status='pending') alle 15 Minuten, um 5 Min versetzt
5,20,35,50 * * * * root /opt/archivmail/archivmail ocr-reprocess --config /etc/archivmail/config.yml --status pending --limit 500 >> /var/log/archivmail/ocr-reprocess.log 2>&1
5,20,35,50 * * * * root /usr/local/bin/archivmail-ocr-reprocess.sh >> /var/log/archivmail/ocr-reprocess.log 2>&1
# ── Weitere Jobs (geplant, noch nicht implementiert) ────────────────────
# 30 2 * * * archivmail /opt/archivmail/archivmail reindex # nächtlicher Voll-Reindex
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
# archivmail — Cron-Wrapper für 'index-pending' (PROJ-58 batch_mode).
#
# Verhindert überlappende Läufe per PID-Lockfile, analog zum mailpiler-Vorbild
# (/usr/libexec/piler/indexer.delta.sh, MAINTMPFILE/DELTATMPFILE-Muster):
# Läuft ein Cron-Job länger als das Intervall (z.B. großer Backlog), würde
# sonst ein zweiter, parallel gestarteter Lauf zusätzliche Last erzeugen statt
# sie zu glätten — genau das soll batch_mode ja vermeiden.
set -euo pipefail
LOCKFILE=/var/run/archivmail/index-pending.lock
LOGTAG=archivmail-index-pending
mkdir -p "$(dirname "$LOCKFILE")"
if [[ -f "$LOCKFILE" ]]; then
echo "INDEX-PENDING ERROR: bereits laufender Lauf seit $(cat "$LOCKFILE")" | logger -t "$LOGTAG"
exit 0
fi
date > "$LOCKFILE"
trap 'rm -f "$LOCKFILE"' EXIT
echo "INDEX-PENDING INFO: Lauf gestartet" | logger -t "$LOGTAG"
/opt/archivmail/archivmail index-pending --config /etc/archivmail/config.yml --limit "${ARCHIVMAIL_INDEX_LIMIT:-500}"
echo "INDEX-PENDING INFO: Lauf beendet" | logger -t "$LOGTAG"
+21
View File
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
# archivmail — Cron-Wrapper für 'ocr-reprocess --status pending' (PROJ-58
# batch_mode). Lockfile-Schutz gegen überlappende Läufe, siehe
# archivmail-index-pending.sh für die ausführliche Begründung.
set -euo pipefail
LOCKFILE=/var/run/archivmail/ocr-reprocess.lock
LOGTAG=archivmail-ocr-reprocess
mkdir -p "$(dirname "$LOCKFILE")"
if [[ -f "$LOCKFILE" ]]; then
echo "OCR-REPROCESS ERROR: bereits laufender Lauf seit $(cat "$LOCKFILE")" | logger -t "$LOGTAG"
exit 0
fi
date > "$LOCKFILE"
trap 'rm -f "$LOCKFILE"' EXIT
echo "OCR-REPROCESS INFO: Lauf gestartet" | logger -t "$LOGTAG"
/opt/archivmail/archivmail ocr-reprocess --config /etc/archivmail/config.yml --status pending --limit "${ARCHIVMAIL_OCR_LIMIT:-500}"
echo "OCR-REPROCESS INFO: Lauf beendet" | logger -t "$LOGTAG"