Node laeuft unter nvm, dessen bin-Verzeichnis nicht im Cron-PATH lag. Jeder Cron-Tick schlug mit `node: command not found` fehl, weshalb manuell angeforderte Suchlaeufe ewig im Status 'angefordert' (wartet) haengen blieben. nvm.sh wird jetzt vor dem Aufruf gesourced. Co-Authored-By: Claude <noreply@anthropic.com>
65 lines
2.4 KiB
Bash
Executable File
65 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Cron-Einstiegspunkt für die Jobsuche (Multi-User).
|
||
#
|
||
# Ersetzt jobsuche-cron.sh + jobsuche-remote-cron.sh: Diese beiden hatten das
|
||
# Suchprofil (sieben Städte, Rollen, Buzzwords) fest im Prompt stehen und liefen
|
||
# mit EINEM globalen API-Token aus der .env — beides ist mit der Multi-User-
|
||
# Plattform hinfällig.
|
||
#
|
||
# Jetzt: Jeder Benutzer pflegt sein Suchprofil und seinen Zeitplan in der App
|
||
# (/jobsuche). Dieses Skript ruft nur noch den Runner auf, der fällige und manuell
|
||
# angeforderte Läufe abarbeitet — je Benutzer mit dessen eigenem Ollama- und
|
||
# API-Schlüssel.
|
||
#
|
||
# Cron (alle 5 Minuten — die Uhrzeit steuert der Benutzer, nicht der Cron):
|
||
# */5 * * * * /opt/jobbi-bewerbung/bin/jobsuche-runner.sh
|
||
#
|
||
# Manueller Lauf: /opt/jobbi-bewerbung/bin/jobsuche-runner.sh
|
||
|
||
set -uo pipefail
|
||
|
||
export HOME="${HOME:-/root}"
|
||
export PATH="/root/.local/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
|
||
# Node läuft unter nvm — der Cron-Pfad kennt das Verzeichnis nicht, also nvm
|
||
# laden, damit `node` (und der Default-Node des Benutzers) gefunden wird. Ohne
|
||
# das schlug jeder Cron-Tick mit `node: command not found` fehl und die
|
||
# wartenden Suchläufe blieben ewig im Status 'angefordert' hängen.
|
||
export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
|
||
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
||
# Claude Code verweigert --dangerously-skip-permissions als root; in dieser
|
||
# Container-/Sandbox-Umgebung mit IS_SANDBOX=1 erlaubt.
|
||
export IS_SANDBOX=1
|
||
|
||
PROJECT_DIR="/opt/jobbi-bewerbung"
|
||
LOG_DIR="$PROJECT_DIR/logs"
|
||
RUNNER="$PROJECT_DIR/source/scripts/jobsuche-runner.js"
|
||
|
||
mkdir -p "$LOG_DIR"
|
||
LOG="$LOG_DIR/jobsuche-runner.log"
|
||
|
||
# Einzelinstanz: ein noch laufender Suchlauf darf vom nächsten Cron-Tick nicht
|
||
# ein zweites Mal gestartet werden.
|
||
exec 9>"$LOG_DIR/jobsuche-runner.lock"
|
||
if ! flock -n 9; then
|
||
exit 0
|
||
fi
|
||
|
||
cd "$PROJECT_DIR" || exit 1
|
||
|
||
# API-Erreichbarkeit prüfen — ohne den Tracker kann der Agent nichts importieren.
|
||
if ! curl -fsS --max-time 10 http://localhost:4327/api/v1/health >/dev/null 2>&1; then
|
||
echo "$(date -Is) FEHLER: Bewerbungs-Tracker (localhost:4327) nicht erreichbar – Lauf übersprungen." >> "$LOG"
|
||
exit 1
|
||
fi
|
||
|
||
node "$RUNNER" >> "$LOG" 2>&1
|
||
STATUS=$?
|
||
|
||
# Log der Runner-Steuerung kurz halten (die eigentlichen Suchlauf-Logs liegen
|
||
# je Lauf separat und werden vom Runner selbst rotiert).
|
||
if [ -f "$LOG" ] && [ "$(wc -l < "$LOG")" -gt 5000 ]; then
|
||
tail -n 2000 "$LOG" > "$LOG.tmp" && mv "$LOG.tmp" "$LOG"
|
||
fi
|
||
|
||
exit $STATUS
|