Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dienste (aus einer Liste) per Batch starten, wenn Sie diese nicht gestartet sind

Frage Microsoft Windows Server

Mitglied: kugelschreiber

kugelschreiber (Level 1) - Jetzt verbinden

14.11.2011 um 11:41 Uhr, 6805 Aufrufe, 14 Kommentare

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:

01.
@ECHO off 
02.
SET scriptPath="D:\BATCH\ServiceRunning" 
03.
 
04.
SET server=mail.server.de 
05.
SET empfaenger=admin@server.de 
06.
SET sender=%computername%@server.de 
07.
 
08.
SET serviceName="serviceName" 
09.
 
10.
REM --- in den momentan laufenden Diensten nach dem o.g. Dienst suchen- 
11.
REM --- ist er enthalten, dann ist gut, ansonsten Dienst starten und Email versenden 
12.
sc query %serviceName% | findstr RUNNING 
13.
IF NOT ERRORLEVEL 1 GOTO ISRUNNING 
14.
GOTO ISNOTRUNNING 
15.
 
16.
:ISNOTRUNNING 
17.
REM --- Dienst neu starten und Datum + Uhrzeit festhalten --- 
18.
net start %serviceName% 
19.
REM --- Ausfall in TXT Datei protokollieren 
20.
ECHO %date% %time% >> ausfall.txt 
21.
REM --- Emailbody für Blat definieren 
22.
SET body="service_doesnt_run.txt" 
23.
REM --- subject für BLAT definieren 
24.
SET subject="The service %serviceName% was not running but has been restartet" 
25.
REM --- Priorität der Email festlegen 
26.
SET priority=1 
27.
REM --- Schließlich einen CALL auf die EMAIL.CMD machen, die dann die Email verschickt 
28.
CALL %scriptPath%\email.cmd %body% %priority% 
29.
GOTO END 
30.
 
31.
:ISRUNNING 
32.
REM --- SET subject="The service %serviceName% is running" 
33.
REM --- SET body="service_is_running.txt" 
34.
REM --- SET priority=0 
35.
REM --- CALL %scriptPath%\email.cmd %body% %priority% 
36.
GOTO END 
37.
 
38.
: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
Mitglied: ITSchlumpf
14.11.2011 um 14:28 Uhr
Hi kugelschreiber,

also Dienste aus einer .txt datei auslesen könntest du so machen.

01.
Set liste= dienste.txt 
02.
 
03.
for /f %%a in (%liste%) do call :main %%a 
04.
 
05.
Set dienste = %1 
06.
 
07.
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
Bitte warten ..
Mitglied: kugelschreiber
14.11.2011 um 14:54 Uhr
Hi Schlumpf

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

01.
do call :main %%a

Was ist main?
01.
Set dienste = %1

Was wird hier erreicht?
01.
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

01.
for /f %%a in (%liste%) do call script1.cmd %%a
Würde das gehen?

Danke für Deine Hilfe

Gruß Kuli
Bitte warten ..
Mitglied: ITSchlumpf
14.11.2011 um 15:03 Uhr
Hi,

sry hatte vergessen :main mit reinzuschreiben.

01.
for /f %%a in (%liste%) do call :main %%a 
02.
 
03.
goto :eof 
04.
 
05.
:Main 
06.
Set dienste = %1 
07.
 
08.
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
Bitte warten ..
Mitglied: pieh-ejdsch
14.11.2011 um 15:31 Uhr
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
Bitte warten ..
Mitglied: ITSchlumpf
14.11.2011 um 15:40 Uhr
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.
Bitte warten ..
Mitglied: kugelschreiber
14.11.2011 um 15:43 Uhr
Zitat von ITSchlumpf:
Hi,

sry hatte vergessen :main mit reinzuschreiben.

01.
> for /f %%a in (%liste%) do call :main %%a 
02.
>  
03.
> :Main 
04.
> Set dienste = %1 
05.
>  
06.
> net start %dienste2% 
07.
> 


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 nur fehölt mir der richtige Aufruf des Scripts mit der richtigen Parameterübergabe.

Gruß Kuli
Bitte warten ..
Mitglied: ITSchlumpf
14.11.2011 um 15:49 Uhr
01.
for /f %%a in (%liste%) do call script1.cmd %%a 
02.
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]
Bitte warten ..
Mitglied: bastla
14.11.2011 um 15:51 Uhr
Hallo kugelschreiber!

Du warst doch eigentlich oben selbst schon so weit :
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
Bitte warten ..
Mitglied: kugelschreiber
14.11.2011 um 16:02 Uhr
Ohhh das klingt gut. Das probiere ich gleich mal...
Bitte warten ..
Mitglied: kugelschreiber
14.11.2011 um 16:34 Uhr
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
01.
@ECHO off 
02.
SET liste ="liste.txt" 
03.
for /f %%a in (%liste%) do call script2.cmd "%%a"
3.Datei. Das ist die die in der 2. Datei per CALL aufgerufen wird:

01.
@ECHO off 
02.
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?
Bitte warten ..
Mitglied: ITSchlumpf
14.11.2011 um 16:44 Uhr
Habs grad mal schnell nachgebaut. und es ging erst auch nicht. Wenn du es allerdings so schreibst müsste es gehen.
script1
01.
SET "liste=liste.txt" 
02.
for /f %%a in (%liste%) do call script2.cmd %%a
Script2
01.
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
Bitte warten ..
Mitglied: bastla
14.11.2011 um 16:47 Uhr
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 PH 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... [Edit]

Grüße
bastla
Bitte warten ..
Mitglied: kugelschreiber
14.11.2011 um 16:47 Uhr
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....
Bitte warten ..
Mitglied: kugelschreiber
14.11.2011 um 18:20 Uhr
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.

01.
@ECHO off 
02.
SET "liste=liste.txt" 
03.
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.
01.
@ECHO off 
02.
SET scriptPath="D:\BATCH\ServiceRunning" 
03.
 
04.
SET server=mail.server.de 
05.
SET empfaenger=admin@server.de 
06.
SET sender=%computername%@server.de 
07.
REM %1 ist die variable %%a aus dem aufrufenden Script 
08.
SET serviceName=%1 
09.
REM --- alle laufende Dienste in service.txt speichern--- 
10.
REM net start | find %serviceName% 
11.
sc query %serviceName% | findstr RUNNING 
12.
IF NOT ERRORLEVEL 1 GOTO ISRUNNING 
13.
GOTO ISNOTRUNNING 
14.
 
15.
:ISNOTRUNNING 
16.
REM --- Dienst neu starten und Datum + Uhrzeit festhalten --- 
17.
net start %serviceName% 
18.
ECHO %date% %time% >> ausfall.txt 
19.
SET body="service_doesnt_run.txt" 
20.
SET subject="The service %serviceName% was not running but has been restartet" 
21.
SET priority=1 
22.
CALL %scriptPath%\email.cmd %body% %priority% 
23.
GOTO END 
24.
 
25.
:ISRUNNING 
26.
REM SET subject="The service %serviceName% is running" 
27.
REM SET body="service_is_runing.txt" 
28.
REM SET priority=0 
29.
REM CALL %scriptPath%\email.cmd %body% %priority% 
30.
GOTO END 
31.
 
32.
:END
Danke an, alle die hier geholfen haben!

Gruß Kuli
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...