Dienste (aus einer Liste) per Batch starten, wenn Sie diese nicht gestartet sind
Hallo Ihr Lieben,
ich habe folgendes Problem. Wir haben ca 7 Server auf denen wir Dienste überwachen wollen.
Nun habe ich auf einem der Server (Testserver) angefangen, einen Dienst per "Batchfile" und "Scheduled Task" zu überwachen und diesen, wenn er nicht gestartet ist automatisch neuzustarten und eine Email an eine bestimmter Verteilergruppe via BLAT.EXE zu schicken.
Mein momentanes Script "script1.cmd" sieht so aus:
Nun ist es aber so, dass das bei einem Dienst gut funktioniert, jedoch haben wir auf einen anderen Server 6 Dienste die überwacht werden sollen. Dabei denke ich an eine Textdatei, die die zu überprüfenden Dienste (einer pro Zeile) beinhaltet.
Dieses Textfile wird dann per for schleife durchlaufen und für jeden der Dienste dann geprüft, ob er läuft. Ich dachte da an folgendes
für(alle dienste in der datei dienste.txt){
rufe das Script script.cmd auf mit der übergabe des Dienstnamens
}
Geht das irgendwie?
Vielen Dank für Eure Hilfe
ich habe folgendes Problem. Wir haben ca 7 Server auf denen wir Dienste überwachen wollen.
Nun habe ich auf einem der Server (Testserver) angefangen, einen Dienst per "Batchfile" und "Scheduled Task" zu überwachen und diesen, wenn er nicht gestartet ist automatisch neuzustarten und eine Email an eine bestimmter Verteilergruppe via BLAT.EXE zu schicken.
Mein momentanes Script "script1.cmd" sieht so aus:
@ECHO off
SET scriptPath="D:\BATCH\ServiceRunning"
SET server=mail.server.de
SET empfaenger=admin@server.de
SET sender=%computername%@server.de
SET serviceName="serviceName"
REM --- in den momentan laufenden Diensten nach dem o.g. Dienst suchen-
REM --- ist er enthalten, dann ist gut, ansonsten Dienst starten und Email versenden
sc query %serviceName% | findstr RUNNING
IF NOT ERRORLEVEL 1 GOTO ISRUNNING
GOTO ISNOTRUNNING
:ISNOTRUNNING
REM --- Dienst neu starten und Datum + Uhrzeit festhalten ---
net start %serviceName%
REM --- Ausfall in TXT Datei protokollieren
ECHO %date% %time% >> ausfall.txt
REM --- Emailbody für Blat definieren
SET body="service_doesnt_run.txt"
REM --- subject für BLAT definieren
SET subject="The service %serviceName% was not running but has been restartet"
REM --- Priorität der Email festlegen
SET priority=1
REM --- Schließlich einen CALL auf die EMAIL.CMD machen, die dann die Email verschickt
CALL %scriptPath%\email.cmd %body% %priority%
GOTO END
:ISRUNNING
REM --- SET subject="The service %serviceName% is running"
REM --- SET body="service_is_running.txt"
REM --- SET priority=0
REM --- CALL %scriptPath%\email.cmd %body% %priority%
GOTO END
:END
Nun ist es aber so, dass das bei einem Dienst gut funktioniert, jedoch haben wir auf einen anderen Server 6 Dienste die überwacht werden sollen. Dabei denke ich an eine Textdatei, die die zu überprüfenden Dienste (einer pro Zeile) beinhaltet.
Dieses Textfile wird dann per for schleife durchlaufen und für jeden der Dienste dann geprüft, ob er läuft. Ich dachte da an folgendes
für(alle dienste in der datei dienste.txt){
rufe das Script script.cmd auf mit der übergabe des Dienstnamens
}
Geht das irgendwie?
Vielen Dank für Eure Hilfe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 176208
Url: https://administrator.de/contentid/176208
Ausgedruckt am: 24.11.2024 um 20:11 Uhr
14 Kommentare
Neuester Kommentar
Hi kugelschreiber,
also Dienste aus einer .txt datei auslesen könntest du so machen.
Nicht getestet.
Kurz zur erklärung.
Kopiere das was in dienste.txt steht, in die Variable "liste" und gehe diese dann Zeile für Zeile durch und übergebe jede Zeile in die Variable "dienste".
Hattest du an sowas gedacht?
Gruß
Schlumpf
also Dienste aus einer .txt datei auslesen könntest du so machen.
Set liste= dienste.txt
for /f %%a in (%liste%) do call :main %%a
Set dienste = %1
net start %dienste%
Nicht getestet.
Kurz zur erklärung.
Kopiere das was in dienste.txt steht, in die Variable "liste" und gehe diese dann Zeile für Zeile durch und übergebe jede Zeile in die Variable "dienste".
Hattest du an sowas gedacht?
Gruß
Schlumpf
Hi,
sry hatte vergessen :main mit reinzuschreiben.
Mit Set dienste=%1 übergebe ich den ersten paramater der for-Schleife in die Variable "dienste". Also in deinem fall werden dann eben nacheinander die Dienste in die variable "dienste" geschrieben.
Ja das würde so gehen wenn ich mich nicht irre.
Gruß
ITSchlumpf
sry hatte vergessen :main mit reinzuschreiben.
for /f %%a in (%liste%) do call :main %%a
goto :eof
:Main
Set dienste = %1
net start %dienste%
Mit Set dienste=%1 übergebe ich den ersten paramater der for-Schleife in die Variable "dienste". Also in deinem fall werden dann eben nacheinander die Dienste in die variable "dienste" geschrieben.
Ja das würde so gehen wenn ich mich nicht irre.
Gruß
ITSchlumpf
moin,
wenn der Dienstname mit Leerzeichen in Anführungszeichen innerhalb der Text steht; genügt der Einzeiler.
@it-schlumpf
in Zeile 02. sollte ein goto :eof hinein
Deine erstellte Variable Löst Du nicht mit %dienste2% auf - sondern mit
alles was vor dem = steht wird als Variablenname festgelegt auch Leerzeichen, ausser ...
siehe Wie Arbeite ich mit Batch UmgebungsVariablen? Erstellung Umgang Erweiterungen Veränderungen
würde in der Sub auch genügen.
Gruß Phil
wenn der Dienstname mit Leerzeichen in Anführungszeichen innerhalb der Text steht; genügt der Einzeiler.
@it-schlumpf
in Zeile 02. sollte ein goto :eof hinein
Deine erstellte Variable Löst Du nicht mit %dienste2% auf - sondern mit
%dienste %
siehe Wie Arbeite ich mit Batch UmgebungsVariablen? Erstellung Umgang Erweiterungen Veränderungen
net start %1
oder
sc start %1
Gruß Phil
Habs grad mal schnell nachgebaut. und es ging erst auch nicht. Wenn du es allerdings so schreibst müsste es gehen.
script1
Script2
Der Fehler liegt wohl in der Filedeklaration. Der versteht das mit den Anführungszeichen nicht richtig. Wenn dann das ganze reinmachen >> SET "liste=liste.txt" dann sollte es gehen ;)
Gruß
schlumpf
script1
SET "liste=liste.txt"
for /f %%a in (%liste%) do call script2.cmd %%a
Script2
echo %1 >> test.txt
Der Fehler liegt wohl in der Filedeklaration. Der versteht das mit den Anführungszeichen nicht richtig. Wenn dann das ganze reinmachen >> SET "liste=liste.txt" dann sollte es gehen ;)
Gruß
schlumpf
Hallo kugelschreiber!
Wenn Du den Dateinamen unter Anführungszeichen setzt (was grundsätzlich keine schlechte Idee ist), musst Du
verwenden, da ein Wert in Klammer, der unter Anführungszeichen steht, ansonsten einfach als zu zerlegender Text interpretiert wird ...
Noch ein Hinweis am Rande: Wie @pieh-ejdsch oben schon erwähnte, sind Leerzeichen in "
wobei ich auch die Anführungszeichen zumeist nicht in die Variable mit einbeziehe, sondern später bei Bedarf setze ... [Edit] Wie das dann aussähe, wurde Dir ohnehin soeben vorgeschlumpf t... [Edit]
Grüße
bastla
Wenn Du den Dateinamen unter Anführungszeichen setzt (was grundsätzlich keine schlechte Idee ist), musst Du
for /f "usebackq" %%a in (%liste%) do call script2.cmd "%%a"
Noch ein Hinweis am Rande: Wie @pieh-ejdsch oben schon erwähnte, sind Leerzeichen in "
set
"-Anweisungen mit Vorsicht zu genießen (bzw sehr oft kontraproduktiv) - daher:SET liste="liste.txt"
Grüße
bastla