Batch-Datei - Einzeiler gesucht?
Hi zusammen
bitte einen Quicktip (wenn es geht, Einzeiler).
- auf einem Server läuft ein Programm unter msaccess - den ganzen Tag, 24/7
- es gibt Gründe, dass der Prozess "rausfliegt". Einmal, wenn der Server wegen Updates reboots macht oder wenn das VPN die Verbindung nicht hält (selten, aber passiert)
- ich möchte erreichen, dass das Programm neu gestartet wird - ist alles schon vorbereitet und funktioniert.
Mit welchem Ein- oder Mehrzeiler kann ich feststellen (z.B. einmal pro Tag in der Zeitsteuerung - würde funktionieren), ob das Ding am Laufen ist.
Habe seit langer zeit keine Windows-Batches mehr gemacht. Unter Linux würde ich einfach machen:
ps -ef | grep msaccess
RC=$?
und dann in Anhängigkeit vom RC / Returncode das Programm neu starten
Das muss doch auch unter Windows gehen.
2 Antworten
tasklist | find /i "msaccess.exe" || "c:\Program Files\MSOfficeXX.xx\msaccess.exe"
Den Pfad zur Installation von Access wirst du den Gegebenheiten anpassen können und müssen.
Mit PowerShell wäre das ganze aktueller. Aber wenn du die veraltete Dos-Shell verwenden willst....
etwas schneller wäre das gesuchte Programm bereits in Tasklist als Filter zu spezifizieren. Damit wird vermieten, das tasklist die Parameter der Programme erfasst und in die Pipeline schickt. Find braucht entsprechend weniger zu analysieren.
tasklist /fi "ImageName eq msaccess.exe"| find /i "msaccess.exe" || "c:\Program Files\MSOfficeXX.xx\msaccess.exe"
Hey cool. Das geht ja genau wie im Linux. Danke
Genau das hab ich gesucht.
Wegen Powershell etc - die Programme laufen seit Jahren im Hintergrund - ja, man könnte sie umstellen, Frage ist doch: was hätte man davon?
@Xandros0506 hat ja schon den Einzeiler geliefert.
wenn Du dir die gelegentliche manuelle Eingabe sparen willst kannst Du auch ein kleine Batch laufen lassen, welche automatisch in bestimmten Zeitabständen prüft, ob der gewünschte Prozess (noch) läuft und gegebenefalls die nötigen Maßnahmen ausführt.
whatchProcess.cmd
echo off
set "WatchProcess=msaccess.exe" &rem zu beobachtender/restartender Prozess
set "WatchIntervall=600" &rem Wartezeit zwischen den Prüfungen in Sekunden
rem Endlosschleife läuft bis das Fenster geschlossen wird
:loop
tasklist /fi "ImageName eq %watchprocess%"| find /i "%watchprocess%" >nul || (
rem restarte das Programm außerhalb der Batch
start "" "%watchprocess%"
timeout 3 >nul &rem ein paar Sekunden warten, bis das gestartete Programm von tasklist erfasst werden kann
goto :loop
)
rem warte bis zur nächsten Prüfung
timeout %WatchIntervall% >nul
goto loop
natürlich wäre ein ProzessWatscher in PowerShell wesentlich effizienter...