kugelschreiber
Goto Top

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:

@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

Content-ID: 176208

Url: https://administrator.de/contentid/176208

Ausgedruckt am: 24.11.2024 um 20:11 Uhr

ITSchlumpf
ITSchlumpf 14.11.2011 um 14:28:40 Uhr
Goto Top
Hi kugelschreiber,

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
kugelschreiber
kugelschreiber 14.11.2011 um 14:54:38 Uhr
Goto Top
Hi Schlumpf

ja an sowas habe ich in etwa gedacht, nur verstehe ich nicht den

do call :main %%a

Was ist main?
Set dienste = %1

Was wird hier erreicht?
net start %dienste2%
//Warum hier den Dienst starten? Das mache ich doch schon in der script1.cmd. Die script1.cmd würde ich gern also per call aufrufen für jedes %%a. So al a

for /f %%a in (%liste%) do call script1.cmd %%a

Würde das gehen?

Danke für Deine Hilfe

Gruß Kuli
ITSchlumpf
ITSchlumpf 14.11.2011 um 15:03:14 Uhr
Goto Top
Hi,

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
pieh-ejdsch
pieh-ejdsch 14.11.2011 um 15:31:07 Uhr
Goto Top
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
%dienste %
alles was vor dem = steht wird als Variablenname festgelegt auch Leerzeichen, ausser ...
siehe Wie Arbeite ich mit Batch UmgebungsVariablen? Erstellung Umgang Erweiterungen Veränderungen

net start %1
oder
sc start %1
würde in der Sub auch genügen.

Gruß Phil
ITSchlumpf
ITSchlumpf 14.11.2011 um 15:40:12 Uhr
Goto Top
AAAhhh xD Jetzt hab ich 5 mal deinen Text gelesen und erst beim 6.mal geschnallt was du von mir willst pieh-ejdsch.
Ja fehler meinerseits sry da hatte ich aber nen anderen ansatz und verpennt die 2 weg zu löschen.
Änder ich grad mal ab.
kugelschreiber
kugelschreiber 14.11.2011 um 15:43:08 Uhr
Goto Top
Zitat von @ITSchlumpf:
Hi,

sry hatte vergessen :main mit reinzuschreiben.

> for /f %%a in (%liste%) do call :main %%a
> 
> :Main
> Set dienste = %1
> 
> net start %dienste2%
> 



In diesem Fall würde die for schleife aber alle Dienste in der datei starten.
Ziel ist es aber vorher wie in meiner ersten Batch script1.cmd erst zu prüfen, ob der Dienst schon läuft. Daher würde ich gern mit der for schleife die Dienste aus der Textdatei herrauslesen und pro Dienst dann die script1.cmd aufrufen, wobei ich den Dienstnamen dabei übergebe. Ich denke wir sind nah dran face-smile nur fehölt mir der richtige Aufruf des Scripts mit der richtigen Parameterübergabe.

Gruß Kuli
ITSchlumpf
ITSchlumpf 14.11.2011 um 15:49:06 Uhr
Goto Top
for /f %%a in (%liste%) do call script1.cmd %%a
goto :eof

und dann eben dein Script1.cmd durchlaufen lassen mit jedem Dienst der in der Schleife ausgelesen wird.

Gruß

[Edit] Weiß net genau ob der Script1.cmd aufruf so ganz stimmt. Vll mal kurz googeln. [/Edit]
bastla
bastla 14.11.2011 um 15:51:21 Uhr
Goto Top
Hallo kugelschreiber!

Du warst doch eigentlich oben selbst schon so weit face-wink:
for /f %%a in (%liste%) do call script1.cmd "%%a"
In Deinem "script1.cmd" müsstest Du natürlich die übergebene Variable auch noch übernehmen - mit
SET serviceName=%1
als Zeile 8 ...

Grüße
bastla
kugelschreiber
kugelschreiber 14.11.2011 um 16:02:30 Uhr
Goto Top
Ohhh das klingt gut. Das probiere ich gleich mal...
kugelschreiber
kugelschreiber 14.11.2011 um 16:34:34 Uhr
Goto Top
HHMMM Irgendie klappt es jetzt noch nicht.
Wollte es mal testen mit einem ähnlichen Script.

1.Datei ist eine Datei namens "liste.txt". Dort stehen drin
test1
test2
test3

2. Datei ist script1.cmd
@ECHO off
SET liste ="liste.txt"  
for /f %%a in (%liste%) do call script2.cmd "%%a"  

3.Datei. Das ist die die in der 2. Datei per CALL aufgerufen wird:

@ECHO off
echo %1 >> test.txt

Jetzt steht aber in der Ausgabedatei "test.txt" folgendes drin:

"liste.txt"

Dort erwarte ich aber doch die drei Werte aus der liste.txt

Oder?
ITSchlumpf
ITSchlumpf 14.11.2011 um 16:44:05 Uhr
Goto Top
Habs grad mal schnell nachgebaut. und es ging erst auch nicht. Wenn du es allerdings so schreibst müsste es gehen.
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
bastla
bastla 14.11.2011 um 16:47:02 Uhr
Goto Top
Hallo kugelschreiber!

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"
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 "set"-Anweisungen mit Vorsicht zu genießen (bzw sehr oft kontraproduktiv) - daher:
SET liste="liste.txt"
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... face-wink [Edit]

Grüße
bastla
kugelschreiber
kugelschreiber 14.11.2011 um 16:47:39 Uhr
Goto Top
Cool!

Danke das hat zumindest gegeht.
Nun bleibt nur noch abzuwarten, ob die Ausgabe, die ja als:

"test1"
"test2"
"test3"

und später meine Dienstnamen sind auch mit dem Anführungszeichen zurecht kommen.
Melde mich gleich nochmal....
kugelschreiber
kugelschreiber 14.11.2011 um 18:20:02 Uhr
Goto Top
SUBBA!

Nu hammers!

Anbei noch mal die kompletten Dateien:

Eine Datei "liste.txt" mit den Servicenamen, wie sie als Servicename in den Eigenschaften eines Service eingetragen ist. Das ist wichtig da der Dienstname in der MMC "services" nicht immer (oder so gut wie nie) gleich dem des eigentlichen aufzurufenen Dienstnamens ist.


Script 1: (check_services.cmd) Das ist die cmd Datei, die später per "Scheduled Task" aufgerufen wird.

@ECHO off
SET "liste=liste.txt"  
for /f %%a in (%liste%) do call running_services.cmd "%%a"  

Script 2: (running_services.cmd) Das ist die cmd Datei die im Script 1(check_services) per CALL aufgerufen wird.
@ECHO off
SET scriptPath="D:\BATCH\ServiceRunning"  

SET server=mail.server.de
SET empfaenger=admin@server.de
SET sender=%computername%@server.de
REM %1 ist die variable %%a aus dem aufrufenden Script
SET serviceName=%1
REM --- alle laufende Dienste in service.txt speichern---
REM net start | find %serviceName%
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%
ECHO %date% %time% >> ausfall.txt
SET body="service_doesnt_run.txt"  
SET subject="The service %serviceName% was not running but has been restartet"  
SET priority=1
CALL %scriptPath%\email.cmd %body% %priority%
GOTO END

:ISRUNNING
REM SET subject="The service %serviceName% is running"  
REM SET body="service_is_runing.txt"  
REM SET priority=0
REM CALL %scriptPath%\email.cmd %body% %priority%
GOTO END

:END

Danke an, alle die hier geholfen haben!

Gruß Kuli