none
Scheduled Job oder Task (Start von Script alle 5 Sekunden) RRS feed

  • Frage

  • Hallo,

    ich such nach einer Möglichkeit ein Powershell-Script alle 5 Sekunden zu starten. Das Script prüft einen Zustand und schreibt das Ergebnis in eine Statusdatei.

    Ich habe das nun mit Scheduled Task und Scheduled Jobs probiert. Letztlich funktioniert beides nicht wie gewünscht. Auf einem Linux System würde ich dafür einen Cron-Job erstellen und die Sache würde laufen.

    Mittlerweile starte ich das Script einmal und lasse es in einer Endlosschleife, unterbrochen durch

    Start-Sleep -seconds 5

    laufen. Passiert dabei ein Fehler, fange ich den mit try, catch ab und schreibe das in ein Event-Log. Das Log könnte ich dann checken und das Script bei einem Fehler erneut starten.

    Das Problem dürfte ja nicht nur ich haben - gibt es da andere Möglichkeiten, hat jemand einen Tip?

    Beste Grüße

    Mittwoch, 20. Oktober 2021 12:00

Antworten

  • Moin,

    ein Prozess, der alle 5 Sekunden etwas macht, ist von seinem Wesen her kein wiederkehrender Task mehr, sondern ein Dienst oder Daemon. Insofern hast Du es schon (fast) richtig gemacht, und man müsste sich lediglich darüber Gedanken machen, wie man Ausnahmen im Skript möglichst global und möglichst sauber abfängt. Wichtige Stichworte dabei sind:

    trap

    $ErrorActionPreference

    Sofern Deine Endlosschleife keine eingebetteten Schleifen beinhaltet, kannst Du im Trap-Block einfach continue setzen, und fertig. Ansonsten musst Du mit einem Flag arbeiten. Das Skript läuft also auch bei Ausnahmen weiter und muss nicht neu gestartet werden. Überwachen musst Du wenigstens den Zustand, dass es die powershell.exe wegreißt. Dafür den Scheduled Task alle Stunde oder so starten, mit der Maßgabe, keine neue Instanz zu erzeugen.

    Das alles mit der Maßgabe, dass es für die gesammelten Daten ausreichend ist, wenn sie mit 5 Sekunden Abstand gesammelt werden (Pause). Brauchst Du wirklich einen Datenpunkt pro 5 Sekunden absolute Zeit, ändert sich die ganze Aufgabe - Du musst zulassen, dass beliebig viele Instanzen des Skripts gleichzeitig gestartet werden, und das ganze tatsächlich mit dem Task Scheduler alle 5 Sekunden triggern. Dabei läufst Du Gefahr, dass sich Tausende von Instanzen von powershell.exe auf der Maschine ansammeln. Damit das nicht passiert, musst Du halt eine Maximaldauer für den Task setzen...


    Evgenij Smirnov

    http://evgenij.smirnov.de



    • Bearbeitet Evgenij Smirnov Mittwoch, 20. Oktober 2021 19:56
    • Als Antwort markiert reactivan Donnerstag, 21. Oktober 2021 16:11
    Mittwoch, 20. Oktober 2021 12:51
  • Mit der XML lassen sich in der Task auch kürzere Wiederholraten einstellen:
    https://docs.microsoft.com/de-de/windows/win32/taskschd/task-scheduler-schema

    - Task exportieren
    - Interval ändern (kürzestes ist 1 Minute)
    - Task Importieren

    Somit kann man auch Einstellungen vornehmen, die der Editor nicht anbietet.

    In der o.g. Schleife mache ich dann z.B. halt max. 10 Durchläufe (5 Sekunden warten + Laufzeit).
    Damit reduziert man die Aufwände und die Task richtet man auf maximal 1 Instanz ein.


    • Bearbeitet Der Suchende Mittwoch, 20. Oktober 2021 13:06
    • Als Antwort markiert reactivan Donnerstag, 21. Oktober 2021 16:11
    Mittwoch, 20. Oktober 2021 13:06
  • Ich habe das nun mit Scheduled Task und Scheduled Jobs probiert. Letztlich funktioniert beides nicht wie gewünscht. 

    Dir ist hoffentlich auch selber klar, dass so etwas unter "nur nicht zu viel verraten" fällt ;-)


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert reactivan Donnerstag, 21. Oktober 2021 16:12
    Mittwoch, 20. Oktober 2021 13:06

Alle Antworten

  • Moin,

    ein Prozess, der alle 5 Sekunden etwas macht, ist von seinem Wesen her kein wiederkehrender Task mehr, sondern ein Dienst oder Daemon. Insofern hast Du es schon (fast) richtig gemacht, und man müsste sich lediglich darüber Gedanken machen, wie man Ausnahmen im Skript möglichst global und möglichst sauber abfängt. Wichtige Stichworte dabei sind:

    trap

    $ErrorActionPreference

    Sofern Deine Endlosschleife keine eingebetteten Schleifen beinhaltet, kannst Du im Trap-Block einfach continue setzen, und fertig. Ansonsten musst Du mit einem Flag arbeiten. Das Skript läuft also auch bei Ausnahmen weiter und muss nicht neu gestartet werden. Überwachen musst Du wenigstens den Zustand, dass es die powershell.exe wegreißt. Dafür den Scheduled Task alle Stunde oder so starten, mit der Maßgabe, keine neue Instanz zu erzeugen.

    Das alles mit der Maßgabe, dass es für die gesammelten Daten ausreichend ist, wenn sie mit 5 Sekunden Abstand gesammelt werden (Pause). Brauchst Du wirklich einen Datenpunkt pro 5 Sekunden absolute Zeit, ändert sich die ganze Aufgabe - Du musst zulassen, dass beliebig viele Instanzen des Skripts gleichzeitig gestartet werden, und das ganze tatsächlich mit dem Task Scheduler alle 5 Sekunden triggern. Dabei läufst Du Gefahr, dass sich Tausende von Instanzen von powershell.exe auf der Maschine ansammeln. Damit das nicht passiert, musst Du halt eine Maximaldauer für den Task setzen...


    Evgenij Smirnov

    http://evgenij.smirnov.de



    • Bearbeitet Evgenij Smirnov Mittwoch, 20. Oktober 2021 19:56
    • Als Antwort markiert reactivan Donnerstag, 21. Oktober 2021 16:11
    Mittwoch, 20. Oktober 2021 12:51
  • Mit der XML lassen sich in der Task auch kürzere Wiederholraten einstellen:
    https://docs.microsoft.com/de-de/windows/win32/taskschd/task-scheduler-schema

    - Task exportieren
    - Interval ändern (kürzestes ist 1 Minute)
    - Task Importieren

    Somit kann man auch Einstellungen vornehmen, die der Editor nicht anbietet.

    In der o.g. Schleife mache ich dann z.B. halt max. 10 Durchläufe (5 Sekunden warten + Laufzeit).
    Damit reduziert man die Aufwände und die Task richtet man auf maximal 1 Instanz ein.


    • Bearbeitet Der Suchende Mittwoch, 20. Oktober 2021 13:06
    • Als Antwort markiert reactivan Donnerstag, 21. Oktober 2021 16:11
    Mittwoch, 20. Oktober 2021 13:06
  • Ich habe das nun mit Scheduled Task und Scheduled Jobs probiert. Letztlich funktioniert beides nicht wie gewünscht. 

    Dir ist hoffentlich auch selber klar, dass so etwas unter "nur nicht zu viel verraten" fällt ;-)


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert reactivan Donnerstag, 21. Oktober 2021 16:12
    Mittwoch, 20. Oktober 2021 13:06
  • Vielen Dank für eure Antworten, beide helfen mir auf ihre Art weiter.

    .. und ja das ist mir schon klar. Einerseits will man keine Romane schreiben und andererseits wollen eventuell Antwortgeber natürlich sehen, dass man sich schon selber bemüht hat. Sowie ich eine stabile. Ich berichte etwas ausführlicher, sowie ich eine für mich stabile Lösung habe.

    Donnerstag, 21. Oktober 2021 16:18