Via Powershell PC-Neustart nach länger ausbleibender Änderung einer .txt-Datei  (Gelesen 176 mal)

Offline bluestarbln

    • Private Wetterstationen in Berlin und Brandenburg
    • Männlich
  • Registriert:
    24.11.2013, 19:07:31
  • Beiträge: 31
Hallo zusammen,

nachdem sich WsWin gestern Abend bei mir wieder verabschiedet hat bin ich nun auf der Suche nach einer Lösung, damit so etwas nicht mehr vorkommt.

Zur Vorgeschichte:

Da es gelegentlich zu Ausfällen (Schnittstelle etc.) kam, habe ich hatte über Datei > Optionen den automatischen Programmneustart von WsWin eingestellt. Offensichtlich mag WsWin nicht, dass man via Remotedesktopverbindung auf den virtuellen Rechner (auf dem WsWin läuft) zugreift.

Das Programm machte nach dem Start mit dem Auslesen der Daten aus der Station erst weiter, nachdem ich heute Morgen (ebenfalls via Remoteverbindung) auf den PC zugegriffen habe. Dann lief wieder alles glatt.

Nun dachte ich mir: Wieso nicht die aktuell.txt im WsWin-Ordner via powershell überwachen und, sobald über einen gewissen Zeitraum keine Einträge mehr erfolgen, den ganzen PC neu starten.

Hierfür habe ich auch bei Administrator.de ein Powershell-Script gefunden und entsprechend angepasst.

Hier das Original:

# Datei deren Inhalt überwacht werden soll
$file = 'D:\Daten\logfile.txt'
# Max Zeit ohne Änderungen in Sekunden
$global:maxtime = 1800
# ---------
# Zeit der letzten Änderung
$global:lastchange = get-date
# Eventuell existierenden Event subscriber löschen
Get-EventSubscriber FileChanged -EA SilentlyContinue | Unregister-Event -Force
# Filesystemwatcher erstellen
$fsw = New-Object IO.FileSystemWatcher (Split-Path $file -Parent), (Split-Path $file -Leaf) -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
# Filesystemwatcher registieren
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
    # Pfad zur Datei
    $fullpath = $Event.SourceEventArgs.FullPath
    $global:lastchange = $Event.TimeGenerated
} | out-null

cls
write-host "Überwache Datei '$file' ..." -F Green
while($true){
    if ((get-date) -gt $global:lastchange.AddSeconds($global:maxtime)){
        write-host "Letzte Änderung an der Datei liegt länger als $global:maxtime Sekunden zurück." -F Yellow
        # Tu hier was
        # z.B. Prozess neu starten oder Rechner neu starten
        # Restart-Computer -Force
        break
    }
    sleep 1
}


Und hier der Code mit meinen Änderungen:

# Datei deren Inhalt überwacht werden soll
$file = 'C:\Wswin\aktuell.txt'
# Max Zeit ohne Änderungen in Sekunden
$global:maxtime = 120
# ---------
# Zeit der letzten Änderung
$global:lastchange = get-date
# Eventuell existierenden Event subscriber löschen
Get-EventSubscriber FileChanged -EA SilentlyContinue | Unregister-Event -Force
# Filesystemwatcher erstellen
$fsw = New-Object IO.FileSystemWatcher (Split-Path $file -Parent), (Split-Path $file -Leaf) -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
# Filesystemwatcher registieren
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
    # Pfad zur Datei
    $fullpath = $Event.SourceEventArgs.FullPath
    $global:lastchange = $Event.TimeGenerated
} | out-null

cls
write-host "Überwache Datei '$file' ..." -F Green
while($true){
    if ((get-date) -gt $global:lastchange.AddSeconds($global:maxtime)){
        write-host "Letzte Änderung an der Datei liegt länger als $global:maxtime Sekunden zurück." -F Yellow
        # Tu hier was
        # z.B. Prozess neu starten oder Rechner neu starten
        Restart-Computer -Force
        break
    }
    sleep 1
}

Mein Problem besteht nun darin, dass der Rechner neu gestartet wird, obwohl minütlich eine Änderung der aktuell.txt erfolgt. Hat jemand von euch eine Idee?

Achso! Wichtig ist mir, dass nicht überwacht wird, ob ein Programm läuft, sondern ob eine Änderung einer Datei stattfand und wenn nicht, dass dann der Rechner neu startet. Das Script ist somit genau das, was ich suche - funktioniert eben leider nicht so richtig.

Ich danke euch schonmal vorab.

Viele Grüße
Steven

Stationsseite: https://www.wetterstats.de || Blog: https://blog.wetterstats.de || Technik: Davis Vantage Pro 2 Aktiv Plus 6163EU, Wetter- u. Webseitenserver: Synology DS218+

Wetterstationen.info Forum


Offline bluestarbln

    • Private Wetterstationen in Berlin und Brandenburg
    • Männlich
  • Registriert:
    24.11.2013, 19:07:31
  • Beiträge: 31
Leider habe ich den "Bearbeiten"-Button nicht gefunden. Deshalb ein weiterer Beitrag zu meinem Anliegen.
--------------

An anderer Stelle konnte mir geholfen werden. Für die- oder denjenige/n, die/den es interessiert, ist die Lösung folgende:

# Datei deren Inhalt überwacht werden soll
$file = 'C:\Wswin\aktuell.txt'
# Max Zeit ohne Änderungen in Sekunden
$maxtime = 120
# ---------
cls
write-host "Überwache Datei '$file' ..." -F Green
while($true){
    if ((get-date) -gt (Get-Item $file).LastWriteTime.AddSeconds($maxtime)){
        write-host "Letzte Änderung an der Datei liegt länger als $maxtime Sekunden zurück." -F Yellow
        # Tu hier was
        # z.B. Prozess neu starten oder Rechner neu starten
        Restart-Computer -Force
        break
    }
    sleep 5
}


  • Code in eine Textdatei kopieren und diese z. B. unter Systemüberwachung.ps1 speichern.
    Ggfs. die Anzahl der Sekunden unter $maxtime und/oder auch die zu überwachende Datei hinter $file anpassen.
  • Verknüpfung erstellen und diese in den Autostart-Ordner ziehen

Das Script startet nun gemeinsam mit dem Rechner und startet diesen neu, sobald über einen gewissen Zeitraum keine automatischen Änderungen an der überwachten Datei stattfinden.
Stationsseite: https://www.wetterstats.de || Blog: https://blog.wetterstats.de || Technik: Davis Vantage Pro 2 Aktiv Plus 6163EU, Wetter- u. Webseitenserver: Synology DS218+

Offline Jürgen

    • http://www.wetterstation-porta.info
    • Männlich
  • Registriert:
    27.07.2001, 02:00:00
  • Beiträge: 4.807
  • Ort:
    Porta Westfalica
  • Station:
    Vantage Pro & WS2500PC
Hallo,
ich habe zwar kein Wind**f, aber beim Betrachten des Scriptes fallen mir zwei Punkte auf:

Wenn ich das richtig sehe, prüft das Script alle 5sec die Datei. Ist die älter als 2min, dann startet der Rechner neu.

1. Wenn der Rechner durch das Script neu gestartet wurde, ist die Datei immer noch "alt". Ist das betreffende Programm, welches die Datei neu schreibt, schnell genug, die Datei neu zu schreiben, bevor das Script wieder einen Neustart auslöst ?

2. Sollte ein größerer Fehler vorliegen und auch der Neustart nicht helfen, dann würde der Rechner bis in alle Ewigkeit neu starten - und zwar so schnell, daß du möglicherweise nicht mehr dazwischen kommt, um das Script abzubrechen (es bleiben ja nur 5sek).

Es sollte zumindest der 5sek Timeout hochgesetzt werden oder erkannt werden, wenn zB. nach 3 Neustarts das immer noch nicht funktioniert, daß dann nicht weiter neu gestartet wird sondern eine email abgesetzt wird o.ä.
Jürgen