Batch datei automatisch neustarten wenn sie beendet wurde?

3 Antworten

Erst mal im voraus, die Endung .bat sollte unter Windows nicht mehr verwendet werden. Windows-Batch hat die Extension .cmd.

Der Unterschied in der Verwendung des Errorstatus ist zwar für Anfänger maginal, aber es gehört zum guten Stil für Batch-Dateien generell unter Windows die Endung .cmd zu verwenden. https://stackoverflow.com/questions/148968/windows-batch-files-bat-vs-cmd

.bat ist eine Extension aus DOS-Zeiten! Ab in den Mülleimer der Geschichte.

Nun zu Deiner Batch:

  • Erstmal solltest Du Dich fragen weshalb der Server das Handtuch wirft.
  • Die nächste Frage, weshalb startet Deine Batch den Sever nicht eienfach neu, wenn dieser beendet wird? (wohl einfach weit Du nicht mit Batch umgehen kannst)

Eigentlich bastelt jedes "ScriptKiddy" gleich als erstes eine Endlosschleife. Also warum nicht den Serveraufruf in eine solche legen?

Zur Demonstration rufe ich statt des Servers einfach mal den Editor (Notepad) auf.

abc.cmd

@echo off
:loop
echo beende jetzt bitte den Editor!
notepad
echo starte den Editor neu...
echo:
goto :loop

...egal wie oft Du das aufgerufene Programm beendest oder sonstwie killst, es wird immer wieder gestartet, weil der nächste Befehl auf des ende des Vorherigen wartet und am Ende zum Anfang gesprungen wird.

Etwas anders läuft der Aufruf einer Batch....

abc.cmd

@echo off
echo hallo ich bin %0 Zeit: %time%
  rem warte 2 Sekunden
timeout 2 >nul
  rem hier endet diese Batch

Demo.cmd

@echo off
:loop
echo ich bin %0
  rem damit aus einer aufgerufenen Batch zurück zum Aufrufer geht,
  rem nutzen  wir call "Name.cmd"
call "abc.cmd"
echo wieder zurueck in %0
echo:
goto :loop
pause

...wenn die aufgerufene Batch nicht gerade wegen eines fatalen Syntaxfehlers abgebrochen wird, kehrt auch diese zum Aufrufer zurück. Welcher seinerseits einer Endlosschleife ausführt.

Es besteht eigentlich kein Grund zur externen Überwachung. Das ganze kann bereits das erste Beispiel händeln.

Natürlich isst es möglich das eine Batch so grottenschlecht prorammiert ist, das sie abstürtzt dann sollte man besser den Fehler beseitigen.

Man kann sie aber auch überwachen.

Wichtig hierfür ist ein einmaliger Name für die zu Überwachende Batch.

abc.cmd

@echo off
  rem eien markanten Fenstertitel festlegen, den garantiert kein anderes Fenster hat
title RumpelheinzchensOmaIhrHund
echo hallo ich bin %0 Zeit: %time%
  rem warte 20 Sekunden
timeout 20 >nul

Watch.cmd

@echo off
title Waechter
:loop
   rem test ob eien Batch mit dem Fensternamen RumpelheinzchensOmaIhrHund läuft
tasklist /nh /fi "WindowTitle eq RumpelheinzchensOmaIhrHund"|find "cmd.exe" >nul 2>&1 ||(
      rem wenn nicht gefunden....
    echo starte abc.cmd in neuem Thread
    start ""  cmd /c "abc.cmd"
)
  rem warte 1 sekunde und prüfe erneut
timeout 1 >nul
goto :loop
pause

Diese Batch prüft im Sekundentakt ob ein Fenster mit dem Titel RumpelheinzchensOmaIhrHund existiert, wenn nicht wird die Batch gestartet.

Sowas erzeugt natürlich ziemlich viel Systemlast. und ist nicht wirklich empfehlenswert.

Glossar:

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Du kannst eine Bach Datei erstellen, die prüft ob eine andere Datei läuft. Die andere Bstch Datei prüft dann ob wiederum die andere läuft. Falls nicht einfach die jeweilige Datei starten. Das wäre dann endlos

Ich kenne die genaue Syntax von Batch nicht, aber dafür verwendet man normalerweise eine while Schleife. While True ergibt dann eine endlos Schleife...