Timeout der Try-FunktionIch habe ein einziges Skript, das viele andere Skripte für Berichtsprozesse zu Geräten und Gebäudeberichten aufruft. Manchmal enthalten die von den Prozesstools kommenden Daten Fehler, die JMP nicht verarbeiten kann.Deshalb habe ich die Aufrufe in eine Try()-Funktion wie diese eingepackt:
For(ii=1, ii < nitems(BulkScriptsToRun), ii++,
try(
Include( BulkScriptsToRun[ii] );
);
);
Manchmal stürzt das enthaltene Skript nicht ab, wird aber auch nicht beendet.
Während dies wahrscheinlich durch Bearbeiten des Skripts und der Art und Weise, wie es die Daten verarbeitet, behoben werden kann, sind es nicht meine Skripte, die ich bearbeiten muss.
Gibt es eine Möglichkeit, dass die Try-Funktion den Versuch als fehlgeschlagen betrachtet, wenn er beispielsweise länger als eine Stunde dauert?
Gibt es eine andere Möglichkeit, dies zu erreichen? Gibt es eine Möglichkeit, Try() mitzuteilen, dass es aufgeben soll?
Danke
Automatisierung und SkripterstellungBetreff: Timeout der Try-FunktionErfordert das eine, dass das andere funktioniert?Wenn Ihr Master-Skript wirklich nur aus einer Reihe separater Skripte besteht, warum führen Sie dann nicht einfach jedes einzelne als eine andere Aufgabe aus?Dann ist es egal.Jeder würde seine eigene Instanz von JMP öffnen und JMP ausführen und dann schließen.Sie können das Timeout auch für jeden einzeln steuern.
Betreff: Timeout der Try-FunktionIch führe das Masterskript über den Taskplaner aus.Und ich kann dort eine Auszeit nehmen. Wenn jedoch eines der Skripte Stunde für Stunde, Tag für Tag denselben Fehler aufweist, werden alle Skripte unterhalb dieses Skripts in der Liste niemals ausgeführt.
Durch die Art und Weise, wie das Hauptskript organisiert ist, werden die später in der Liste aufgeführten Skripte seltener ausgeführt, sodass es Wochen dauern kann, bis man merkt, dass sie vollständig übersprungen werden.Ich könnte die Reihenfolge der Liste einfach 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 behebe (das ist schlimmer).
Außerdem meldet das Masterskript seinen eigenen Fortschritt, nachdem alle Skripte ausgeführt wurden.Dies würde niemals passieren, wenn die Aufgabe beendet wird.
Meine aktuelle Lösung lautet: Kommentieren Sie das problematische Skript aus und warten Sie, bis sich die verantwortliche Partei ausreichend darum gekümmert hat, das Problem zu beheben.
Es klappt.
Betreff: Timeout der Try-FunktionDas klingt nach etwas, das mit dem Windows-Taskplaner erledigt werden könnte, wenn Sie die Skripts nicht ändern können. Erstellen Sie ein Skript, das die anderen Skripte einschließt, verwalten Sie alle möglichen Fehler in Ihrem „Einschluss“-Skript und fügen Sie der Planeraufgabe eine Zeitüberschreitung hinzu. Wenn die Zeit abgelaufen ist, wird die Ausführung dort abgebrochen, wo sie ausgeführt wurde.
Im Allgemeinen kann die Ausführung einer Reihe von Skripten, über die Sie keine Kontrolle haben, schnell chaotisch werden, da Sie möglicherweise viele verschiedene 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
- Überstehen Sie Situationen, in denen die Skripte die Standardeinstellung „Names To Here(1)“ nicht verwenden.
- Überleben Sie von der Verwendung von „Symbole löschen/Globale löschen“ im mitgelieferten Skript
- Schließen Sie unnötige Datentabellen und Berichte, um Speicherplatz zu sparen
- Fehler abfangen, die JMP stoppen würden
- Verwendung von Exit/Quit in den enthaltenen Skripten
- Protokollieren Sie die Skriptausführung, um zu erfahren, was ordnungsgemäß ausgeführt wurde
Die meisten davon sind viel einfacher zu handhaben, indem die enthaltenen Skripte trainiert/modifiziert werden.
Betreff: Timeout der Try-FunktionNein, try() verfügt über keinen Timeout-Mechanismus; Es ist dem C++-Try-Throw-Catch-Mechanismus sehr ähnlich. Wie Sie vermuten, müssten Sie die Logik in jedes der enthaltenen Skripte einfügen, die so etwas bewirken könnten
startSeconds = tickSeconds();
...
while(...
if( tickseconds() - startSeconds > 100, throw("Used more than 100 seconds") );
...)
Ich weiß, dass Sie gesagt haben, dass Sie diese Skripte nicht zur Bearbeitung öffnen können, aber wenn ja, möchten Sie vielleicht, dass sie einen Rückruf auf Ihren Code durchführen, um den Fortschritt anzuzeigen. Dann können Sie bei Bedarf den Wurf über den Rückruf ausführen. In jedem Fall müssten Sie in jedem der Skripte einen Punkt finden, an dem eine Schleife etwas wiederholt, und die Zeitüberschreitung hängt davon ab, dass sich das Skript einigermaßen gut verhält (um die Zeit ständig zu überprüfen).
Der Windows-Taskplaner könnte ebenfalls Teil der Lösung sein; Ich habe es nicht verwendet, aber es gab eine Reihe von Threads, in denen Fragen dazu gestellt wurden. Kann ich das JMP-Programm über ein Skript schließen?könnte etwas vorschlagen.