Timeout der Try-FunktionIch habe ein einziges Skript, das viele andere Skripte aufruft, um Prozesse für Geräte und Gebäudeberichte zu melden. Manchmal enthalten die Daten, die von den Prozesstools kommen, Fehler, die JMP nicht verarbeiten kann.Also habe ich die Aufrufe in eine Try()-Funktion wie folgt verpackt:
For(ii=1, ii < nitems(BulkScriptsToRun), ii++,
try(
Include( BulkScriptsToRun[ii] );
);
);
Manchmal stürzt das mitgelieferte Skript nicht ab, wird aber auch nicht beendet.
Obwohl dies wahrscheinlich durch Bearbeiten des Skripts und der Art und Weise, wie es die Daten verarbeitet, behoben werden könnte, sind es nicht meine Skripts, die bearbeitet werden müssen.
Gibt es eine Möglichkeit, dass die Try-Funktion den Versuch als fehlgeschlagen betrachtet, wenn er beispielsweise länger als 1 Stunde dauert?
Gibt es eine andere Möglichkeit, dies zu erreichen? Gibt es eine Möglichkeit, Try() mitzuteilen, dass es aufgeben soll?
Danke
SkripterstellungBetreff: Timeout der Try-FunktionNein, try() hat keinen Timeout-Mechanismus; Es ist dem Try-Throw-Catch-Mechanismus von C++ sehr ähnlich. Wie Sie vermuten, müssten Sie die Logik in jedes der enthaltenen Skripte einfügen, was so etwas wie tun könnte
startSeconds = tickSeconds();
...
while(...
if( tickseconds() - startSeconds > 100, throw("Used more than 100 seconds") );
...)
Ich weiß, dass Sie gesagt haben, dass Sie diese Skripts nicht zum Bearbeiten öffnen können, aber wenn Sie dies getan haben, möchten Sie vielleicht, dass sie einen Rückruf an Ihren Code senden, um den Fortschritt anzuzeigen. Dann könnten Sie bei Bedarf den Wurf aus dem Rückruf ausführen. In jedem Fall müssten Sie in jedem der Skripte einen Punkt finden, an dem eine Schleife etwas wiederholt, und das Timeout hängt davon ab, ob sich das Skript einigermaßen gut verhält (um die Zeit ständig zu überprüfen).
Der Windows-Taskplaner könnte auch Teil der Lösung sein; Ich habe es nicht benutzt, aber es gab eine Reihe von Threads, in denen Fragen dazu gestellt wurden. Kann ich das jmp-Programm von einem Skript aus schließen?könnte etwas vorschlagen.
Betreff: Timeout der Try-FunktionDies klingt nach etwas, das mit dem Windows-Taskplaner durchgeführt werden könnte, wenn Sie die Skripts nicht ändern können. Erstellen Sie ein Skript, das die anderen Skripte enthält, verwalten Sie alle Fehler, die Sie in Ihrem "Einschluss" -Skript haben können, und fügen Sie der Task des Planers eine Zeitüberschreitung hinzu. Nachdem die Zeit abgelaufen ist, wird die Ausführung beendet, wo immer sie angekommen ist.
Im Allgemeinen kann das Ausführen von Stapeln von Skripten, über die Sie keine Kontrolle haben, schnell chaotisch werden, da Sie möglicherweise eine Menge verschiedener Dinge erledigen müssen (ich musste so etwas tun). Im Folgenden sind einige Probleme (oder Verbesserungsmöglichkeiten) aufgeführt, mit denen ich konfrontiert war:
- Namespace-Kollision verwalten
- Unnötige Symbole löschen/löschen
- Überleben aus Situationen, in denen die Skripts keine Namen standardmäßig bis hierhin verwenden(1)
- Überlebt die Verwendung von Clear Symbols / Delete Globals im enthaltenen Skript
- Schließen Sie unnötige Datentabellen und Berichte, um Speicherplatz zu sparen
- Abfangen von Fehlern, die JMP stoppen würden
- Verwendung von Exit/Quit in den enthaltenen Skripten
- Protokollieren Sie die Skriptausführung, um zu wissen, was ordnungsgemäß ausgeführt wurde
Die meisten davon sind viel einfacher zu handhaben, indem die enthaltenen Skripte trainiert / modifiziert werden.
Betreff: Timeout der Try-FunktionIch führe das Master-Skript vom Taskplaner aus.Und ich kann dort eine Auszeit nehmen. Aber wenn eines der Skripte Stunde für Stunde, Tag für Tag denselben Fehler hat, werden alle Skripte unter diesem in der Liste niemals ausgeführt.
So wie das Hauptskript organisiert ist, werden die Skripte weiter unten in der Liste seltener ausgeführt, sodass es Wochen dauern kann, bis Sie bemerken, dass sie vollständig übersprungen werden.Ich könnte einfach die Reihenfolge der Liste umkehren - aber dann werden die Skripte, die alle 10 Minuten ausgeführt werden müssen, jedes Mal übersprungen, bis ich das Problem im problematischen Skript behoben habe (das ist schlimmer).
Außerdem meldet das Master-Skript seinen eigenen Fortschritt, nachdem alle Skripts ausgeführt wurden.Dies würde niemals passieren, wenn die Aufgabe beendet wird.
Meine aktuelle Lösung ist: Kommentieren Sie das problematische Skript aus und warten Sie, bis sich die verantwortliche Partei genug darum gekümmert hat, es zu beheben.
Es klappt.