Zum Inhalt springen

Läufe und Probleme

Ein Skript, das handelt, während niemand zusieht, ist ohne Protokoll nicht zu verantworten. Das Dock unten an der Skriptseite ist der Ort, den man um 08:00 Uhr aufmacht, um zu sehen, was um 03:00 Uhr passiert ist.

Jede Zeile ist ein Lauf: wann er begann, wie lange er dauerte, ob er erfolgreich war und warum er lief. Aufgeklappt zeigt er, was geschrieben wurde, was das Skript ausgegeben hat und — falls er scheiterte — die Meldung mit der Zeile im Code.

Das Protokoll zeigt Tatsachen. Jeder Schreibvorgang steht mit seinem Ausgang da: hat die Maschine erreicht, hier festgehalten oder gescheitert. Was nur geschrieben würde, gibt es im Probelauf und nirgends sonst.

Die Ursachen, und zwei davon sind keine Läufe des Skripts:

Ursache Bedeutet
Tag geändert ein gebundenes Tag wurde geschrieben
Takt der zyklische Auslöser
Zeitplan ein fälliger Zeitpunkt
verpasst — die Instanz lief nicht der Zeitpunkt war fällig, es war niemand da. Nicht nachgeholt
Watchdog: kein Lauf angekommen die Uhr hat gemerkt, dass ein zyklisches Skript stehengeblieben ist
Systemereignis Start, Herunterfahren, Verbindung
von Hand jemand hat gestartet

Das Protokoll ist begrenzt. Die letzten 200 Läufe je Skript bleiben, ältere werden entfernt. Auf der Seite steht die Zahl. Ein Skript, das jede Sekunde läuft, erzeugt 86.400 Zeilen am Tag — unbegrenzt wäre die größte Tabelle der Instanz ein Hilfsmittel zur Fehlersuche. Einzelne Läufe stehen deshalb auch nicht im Audit-Protokoll; dort steht, wer das Skript geändert hat.

Live mitlesen. Neben den Reitern steht Live in der Diagnose, sobald die Diagnoseleiste in diesem Browser eingeschaltet ist (siehe Betrieb, Protokolle und Diagnose). Der Link öffnet sie gefiltert auf dieses Skript und zeigt, was ein von Ihnen gestarteter Lauf mit print() ausgibt. Ist die Leiste ausgeschaltet, gibt es den Link nicht.

Auslöser kommen in der Geschwindigkeit einer Maschine, ein Skript läuft in der Geschwindigkeit eines Python-Prozesses. Dazwischen steht eine Warteschlange je Skript, und sie ist begrenzt. Ist sie voll, fällt der älteste Eintrag heraus — der Wert, der am wenigsten wahrscheinlich noch zählt.

Das Verlorene wird gezählt und angezeigt, am Blatt im Baum und in der Liste:

  • wartend — was gerade ansteht.
  • Auslöser verworfen — das Skript ist langsamer als seine Quelle. Diese Zahl ist der Hinweis, dass etwas nicht passt, nicht ein Schönheitsfehler.
  • von der Grenze abgewiesen — die Ratenbegrenzung hat gegriffen.

Je Skript läuft immer nur ein Lauf zur Zeit; verschiedene Skripte laufen nebeneinander.

Unter Grenzen steht, wie viele Läufe je Minute höchstens stattfinden. Voreingestellt sind 120. Das ist die Grenze für den Fall, der keine Rückkopplung ist: ein Skript, das von einer schnellen Maschine tausendmal je Sekunde ausgelöst wird.

Gegen die Rückkopplung selbst — ein Skript schreibt ein Tag, dieses Schreiben löst ein Skript aus — hilft etwas anderes: Mit jedem Schreibvorgang wandert die Kette seiner Verursacher mit. Taucht ein Skript darin zweimal auf, wird der Lauf abgelehnt und benannt.

Hier steht, was am Code auffällt, ohne dass er gelaufen wäre:

  • Syntaxfehler, mit der Zeile.
  • Hier nicht gefunden: … — ein Import, der weder auf ein Skript hier zeigt noch auf ein Modul, von dem wir sicher wissen, dass Python es mitbringt. Das kann völlig richtig sein: eine Anlage kann Python-Pakete haben, die TrakState nicht kennt. Deshalb steht dort „hier nicht gefunden” und nicht „gibt es nicht”.

Steht da Keine Probleme, lösen sich die Importe auf und der Code lässt sich lesen. Ob er das Richtige tut, sagt nur der Probelauf.

Hat diese Instanz keinen Auslöser-Kreislauf, sagt die Seite das oben: Es läuft nichts von allein, Skripte lassen sich bearbeiten und von Hand starten. Der Schalter Eingeschaltet verspricht dann nichts, was nicht eingelöst wird.