Der Fehler, der zweieinhalb Monate unsichtbar blieb

In einem Kundenprojekt läuft ein Beobachter für öffentliche Ausschreibungen: Er zieht nachts neue Vergabeunterlagen, bewertet sie nach Passgenauigkeit und legt die interessanten in einer Liste ab. Eingerichtet war er als zeitgesteuerter Auftrag auf einem Mac. Er lief zuverlässig — und tat monatelang nichts.

In der Protokolldatei stand jede Nacht dieselbe Zeile: Operation not permitted. Kein Absturz, kein Fehler im Programm. Die Zeitsteuerung von macOS hat schlicht keinen Vollzugriff auf die Festplatte und darf deshalb nichts ausführen, was im Benutzerordner liegt. Der Auftrag startete pünktlich, wurde vom Betriebssystem abgewiesen und beendete sich sauber. Rund 40 identische Fehlläufe über etwa zweieinhalb Monate — und in dieser Zeit verpasste Vergaben, die nicht nachgeholt werden können, weil Fristen abgelaufen waren.

Warum niemand es gemerkt hat

Ein Lauf, der abstürzt, meldet sich. Ein Lauf, der gar nicht erst startet, meldet sich nicht — er sieht von außen aus wie eine ruhige Nacht ohne neue Treffer. Und genau so wurde er gelesen. Jede geplante Automatisierung braucht deshalb ein Lebenszeichen: eine Meldung auch dann, wenn nichts gefunden wurde. Stille darf nie ein gültiges Ergebnis sein.

Warum der Arbeitsrechner grundsätzlich der falsche Ort ist

Der Berechtigungsfehler war der Auslöser, aber nicht der eigentliche Grund. Ein Laptop ist für wiederkehrende Läufe schon vom Wesen her ungeeignet.

AnforderungArbeitsrechnerServer oder Auftragsdienst
Läuft nachtsnur wenn er wach und aufgeklappt istimmer
Verbindungwechselndes WLAN, Hotel, FlughafenRechenzentrum
Dateizugriffdurch Berechtigungssystem eingeschränktfrei im eigenen Arbeitsverzeichnis
Sichtbarkeit von Fehlernlokale Protokolldatei, die niemand liestVerlauf mit Benachrichtigung
Geheimnisseim Klartext im Benutzerordnerverschlüsselter Speicher
Abbruch mittendrinjederzeit möglichselten, und mit Wiederholung
Gegenüberstellung aus zwei eigenen Vorfällen: dem Berechtigungsfehler im Vergabe-Monitoring und einem abgebrochenen Lauf im Flughafen-WLAN, August 2026.

Der zweite Vorfall ist der anschaulichere. Ein Lauf, der Betriebsdaten anreichert, braucht pro Datensatz rund anderthalb Sekunden Pause — nicht aus technischen Gründen, sondern aus Rücksicht: Er beachtet die Zugriffsregeln der jeweiligen Website und belastet keinen fremden Server. Ein paar tausend Datensätze füllen damit eine ganze Nacht. Auf einem Laptop im Flughafen-WLAN brach genau dieser Lauf mittendrin ab — und zwar in dem Abschnitt, in dem kostenpflichtige Prüfungen liefen. Der Abbruch kostete also nicht nur Zeit, sondern Guthaben.

Der Zustand ist wichtiger als der Code

Beim Umzug auf einen Auftragsdienst haben wir den ersten Entwurf bewusst zustandslos gebaut: Jeder Lauf fängt bei null an, nichts wird zwischen den Nächten gespeichert. Das ist sauber, einfach zu verstehen — und war falsch.

Bei rund 1.500 verarbeiteten Datensätzen je Nacht und vollständigem Neuaufbau am nächsten Tag sammelt sich nie etwas an. Die Maschine hätte bis in alle Ewigkeit dieselben ersten 1.500 Einträge gelesen und wäre nie zum Rest vorgedrungen. Dieselbe Bewertung wäre jede Nacht neu bezahlt worden, und eine eingebaute Sperrfrist, die verhindert, dass derselbe Empfänger mehrfach angesprochen wird, hätte nie gegriffen — sie braucht ein Gedächtnis.

Die Regel daraus ist unspektakulär und wird trotzdem ständig verletzt: Der Bearbeitungsstand muss den Lauf überleben und zurückgeschrieben werden. Wo das passiert, ist zweitrangig — Datei im Projektverzeichnis, Datenbank, verschlüsselter Speicher. Entscheidend ist, dass der nächste Lauf weiß, wo der letzte aufgehört hat.

An anderer Stelle hat uns dieselbe Frage noch einmal eingeholt: Dort schrieb der Auftrag nur seine Berichte zurück, nicht sein Arbeitsverzeichnis. Eine Warteschlange als Datei wäre nach jedem Durchgang leer gewesen. Die Lösung war, die Warteschlange dorthin zu legen, wo sie ohnehin überlebt — in das System, mit dem der Ablauf arbeitet.

Laufzeit kostet Geld, Warten kostet am meisten

Auftragsdienste rechnen nach Minuten. Das klingt harmlos, bis man nachrechnet. Ein Aufbau mit häufigen kurzen Läufen und wenigen langen kam bei uns auf etwa 190 Minuten pro Tag, also rund 5.700 Minuten im Monat — gegen 2.000 Minuten, die im Tarif enthalten waren.

Daraus folgt eine Regel, die den Entwurf prägt: Niemals durch Schlafen warten. Ein Lauf, der zehn Minuten pausiert, weil eine Antwort erst später rausgehen soll, bezahlt diese zehn Minuten. Verzögerungen gehören in eine Warteschlange, die beim nächsten regulären Lauf abgearbeitet wird — nicht in einen wartenden Prozess.

Zweite Stellschraube ist die Zeitgrenze je Auftrag. Ein Bewertungslauf brauchte bei uns knapp 29 Minuten; die Voreinstellung hätte ihn vorher abgeschnitten. Solche Grenzen gehören auf einen gemessenen Wert gesetzt, mit Reserve — nicht auf ein Gefühl.

Geheimnisse und Daten beim Umzug

Was auf dem eigenen Rechner unbedenklich als Datei im Benutzerordner liegt, wird beim Umzug zum Thema. Drei Punkte haben sich als tragfähig erwiesen:

  • Zugangsschlüssel nur als hinterlegtes Geheimnis, zur Laufzeit in eine Datei geschrieben und am Ende gelöscht. Nie im Projektstand.
  • Das Projekt bleibt nicht öffentlich, wenn der Bearbeitungsstand personenbezogene Daten enthält — bei uns Firmenkontakte und Auftragswerte. Der zurückgeschriebene Zustand hat dieselbe Vertrauensgrenze wie die Zugangsschlüssel.
  • Kein automatischer Versand nach außen. Der Lauf bereitet Anschreiben vor, verschickt sie aber nicht — ein Mensch entscheidet je Fall. Eine nächtliche Automatik, die ungeprüft nach außen kommuniziert, ist der Punkt, an dem ein stiller Fehler laut wird.

Was der Umzug am Ende gebracht hat

Der Beobachter läuft seitdem täglich zu fester Uhrzeit im Rechenzentrum, mit sichtbarem Verlauf und Benachrichtigung bei Fehlläufen. Die laufenden Kosten liegen im niedrigen einstelligen Eurobereich pro Monat — die kommerziellen Vergabedatenbanken, die denselben Zweck erfüllen, bewegen sich in einer ganz anderen Größenordnung.

Aber die eigentliche Verbesserung ist nicht der Preis. Es ist, dass ein Fehllauf jetzt auffällt. Zweieinhalb Monate Stille waren nicht deshalb möglich, weil die Technik schlecht war, sondern weil niemand ein Signal bekam. Diesen Punkt würde ich vor jeder Automatisierung klären: Woran genau merken wir, dass sie nicht mehr läuft?

Wie eine solche Zurückhaltung im Kundenkontakt aussieht — Entwürfe zur Freigabe statt automatischem Versand — steht im Beitrag zur Automatisierung im Kundenservice. Warum eine dauerhaft erreichbare Funktion manchmal zwingend ist und ein zeitgesteuerter Lauf gar nicht in Frage kommt, zeigt der Beitrag zur WhatsApp-Anbindung ohne Provider.

Wann der eigene Rechner reicht

Für einmalige Arbeiten, für Auswertungen, die man ohnehin dabei begleitet, und für alles, was manuell angestoßen wird, ist der Arbeitsrechner völlig in Ordnung. Auch ein Skript, das eine Datei umbaut oder einen Bericht erzeugt, muss nicht ins Rechenzentrum.

Die Grenze verläuft nicht bei der Komplexität, sondern bei der Frage, ob jemand zusieht. Sobald ein Ablauf zu einer festen Uhrzeit ohne Beobachter starten soll, gehört er woandershin — und er braucht ein Lebenszeichen, einen überlebenden Bearbeitungsstand und eine gemessene Zeitgrenze. Diese drei Dinge sind der Unterschied zwischen einer Automatisierung und einer Automatisierung, die man betreibt.

Häufige Fragen

Warum läuft mein Cronjob auf dem Mac nicht, obwohl das Skript funktioniert?

Sehr wahrscheinlich wegen des Berechtigungssystems: Die Zeitsteuerung hat keinen Vollzugriff auf die Festplatte und darf nichts ausführen, was im Benutzerordner liegt. In der Protokolldatei steht dann Operation not permitted. Der Auftrag startet, wird abgewiesen und beendet sich sauber.

Woran merke ich, dass eine nächtliche Automatisierung nicht mehr läuft?

Nur an einem Lebenszeichen. Ein Lauf, der abstürzt, meldet sich; einer, der nie startet, sieht aus wie eine ruhige Nacht ohne Treffer. Deshalb muss jeder Lauf eine Meldung erzeugen — auch dann, wenn er nichts gefunden hat.

Muss ich den Bearbeitungsstand wirklich zurückschreiben?

Ja, sobald der Lauf mehr Daten hat, als er in einer Nacht schafft. Ohne Gedächtnis beginnt jeder Lauf von vorn, bezahlt dieselbe Arbeit erneut und kommt nie über den Anfang hinaus. Sperrfristen, die Doppelansprachen verhindern, greifen ohne Zustand ebenfalls nie.

Wie vermeide ich hohe Kosten bei Auftragsdiensten?

Niemals durch Schlafen warten. Ein Lauf, der zehn Minuten pausiert, bezahlt diese zehn Minuten. Verzögerungen gehören in eine Warteschlange, die beim nächsten regulären Lauf abgearbeitet wird.

Wann reicht der eigene Rechner aus?

Für alles, was manuell angestoßen wird und begleitet abläuft. Die Grenze verläuft nicht bei der Komplexität, sondern bei der Frage, ob jemand zusieht — sobald ein Ablauf zu fester Uhrzeit ohne Beobachter startet, gehört er woandershin.