93 lines
3.3 KiB
Python
93 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Scheduler für CameraSave - läuft zur exakten 5-Minuten-Grenze
|
|
"""
|
|
import time
|
|
import subprocess
|
|
import sys
|
|
from datetime import datetime
|
|
|
|
INTERVAL_MINUTES = 5
|
|
|
|
def seconds_until_next_interval():
|
|
"""Berechnet die Sekunden bis zur nächsten 5-Minuten-Grenze."""
|
|
now = datetime.now()
|
|
current_minute = now.minute
|
|
current_second = now.second
|
|
current_microsecond = now.microsecond
|
|
|
|
# Nächste 5-Minuten-Grenze berechnen
|
|
next_minute = ((current_minute // INTERVAL_MINUTES) + 1) * INTERVAL_MINUTES
|
|
|
|
# Minuten bis zur nächsten Grenze
|
|
minutes_to_wait = next_minute - current_minute
|
|
if minutes_to_wait <= 0:
|
|
minutes_to_wait += INTERVAL_MINUTES
|
|
|
|
# In Sekunden umrechnen und aktuelle Sekunden abziehen
|
|
seconds = (minutes_to_wait * 60) - current_second - (current_microsecond / 1_000_000)
|
|
|
|
return max(1, int(seconds)) # Mindestens 1 Sekunde warten
|
|
|
|
def run_main():
|
|
"""Führt main.py aus."""
|
|
try:
|
|
result = subprocess.run(
|
|
[sys.executable, "main.py"],
|
|
capture_output=True,
|
|
text=True
|
|
)
|
|
print(result.stdout, end='')
|
|
if result.stderr:
|
|
print(result.stderr, end='', file=sys.stderr)
|
|
return result.returncode
|
|
except Exception as e:
|
|
print(f"❌ Fehler beim Ausführen von main.py: {e}", file=sys.stderr)
|
|
return 1
|
|
|
|
def main():
|
|
"""Hauptschleife - wartet auf 5-Minuten-Grenzen."""
|
|
print(f"🕐 CameraSave Scheduler gestartet (Intervall: {INTERVAL_MINUTES} Minuten)")
|
|
print(f" Läuft zur exakten {INTERVAL_MINUTES}-Minuten-Grenze der Uhrzeit")
|
|
print()
|
|
|
|
while True:
|
|
try:
|
|
# Warte bis zur nächsten 5-Minuten-Grenze
|
|
wait_seconds = seconds_until_next_interval()
|
|
now = datetime.now()
|
|
|
|
# Berechne die nächste Ausführungszeit
|
|
next_minute = ((now.minute // INTERVAL_MINUTES) + 1) * INTERVAL_MINUTES
|
|
if next_minute >= 60:
|
|
# Überlauf zur nächsten Stunde
|
|
next_run = now.replace(hour=(now.hour + 1) % 24, minute=next_minute % 60, second=0, microsecond=0)
|
|
if now.hour == 23 and next_minute >= 60:
|
|
# Überlauf zum nächsten Tag
|
|
next_run = (now + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0)
|
|
else:
|
|
next_run = now.replace(minute=next_minute, second=0, microsecond=0)
|
|
|
|
print(f"⏰ Warte {wait_seconds}s bis {next_run.strftime('%H:%M:%S')}")
|
|
time.sleep(wait_seconds)
|
|
|
|
# Führe main.py aus
|
|
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
print(f"\n▶️ [{timestamp}] CameraSave wird ausgeführt...")
|
|
returncode = run_main()
|
|
|
|
if returncode == 0:
|
|
print(f"✅ [{timestamp}] Erfolgreich abgeschlossen\n")
|
|
else:
|
|
print(f"⚠️ [{timestamp}] Beendet mit Code {returncode}\n", file=sys.stderr)
|
|
|
|
except KeyboardInterrupt:
|
|
print("\n🛑 Scheduler gestoppt")
|
|
break
|
|
except Exception as e:
|
|
print(f"❌ Unerwarteter Fehler: {e}", file=sys.stderr)
|
|
time.sleep(60) # Bei Fehler 1 Minute warten
|
|
|
|
if __name__ == "__main__":
|
|
main()
|