mmaiwald
Goto Top

Dienste stoppen und neu starten und Errorhandling

Hallo,

ich möchte mehrere Dienste per Batch auf einem W2k3 Server täglich neu starten lassen.
Dazu habe ich mir eine for Schleife gebaut, die die Dienste auch stoppt und startet und auch ein Logfile schreibt.
Ich möchte aber, dass auch sichergestellt ist, dass erst alle Dienste gestoppt und anschliessend gestartet werden.

Kann mir einer von Euch eine Denkanstoss geben...

Hier noch mein Auszug aus dem Batch

:: Umgebungsvariable setzen
set jahr=%date:~6,4%
set monat=%date:~3,2%
set tag=%date:~0,2%
set stunde=%time:~0,2%
set minute=%time:~3,2%
set sekunde=%time:~6,2%
set logfile="PFAD\%jahr%%monat%%tag%_%stunde%%minute%.log"

::Zeitangabe für stoppen mitgeben
echo --------------------------------- >> %logfile%
echo %date% - %stunde%:%minute%:%sekunde% Uhr >> %logfile%
echo --------------------------------- >> %logfile%

::Dienstestop und Auslesen des Dienststatus
for %%f in (Dienst1 Dienst2 ....Dienst32) do (
sc stop %%f
sleep 3
for /F "tokens=2" %%g in ('sc query %%f ^|findstr %%f') do for /F "tokens=4" %%h in ('sc query %%f ^|findstr STATE') do @echo %%h %%g >> %logfile%
)

echo --------------------------------- >> %logfile%

Dienstestart und Auslesen des Dienststatus
for %%f in ( Dienst1 Dienst2 ....Dienst32) do (
sc start %%f
sleep 3
for /F "tokens=2" %%g in ('sc query %%f ^|findstr %%f') do for /F "tokens=4" %%h in ('sc query %%f ^|findstr STATE') do @echo %%h %%g >> %logfile%
)

:eof

Content-ID: 181448

Url: https://administrator.de/forum/dienste-stoppen-und-neu-starten-und-errorhandling-181448.html

Ausgedruckt am: 08.04.2025 um 21:04 Uhr

Skyemugen
Skyemugen 05.03.2012 um 17:27:41 Uhr
Goto Top
Aloha,

Hilfe kommt später, nachdem du unsere ##blue|##-Formatierung gefunden hast, bei Plaintext liest mein Hirn nur ...

greetz André
Nagus
Nagus 05.03.2012 um 17:48:42 Uhr
Goto Top
Moin,

ich helf mal mit der Formatierung face-smile (siehe unten)

kann es sein das mehr als zweimal code Formartierungen nicht gehen?
Mal so ganz blöde gefragt: du liest doch schon den Status der Dienste aus. Wenn der nicht 1 ist, ist der Dienste nicht angehalten :? Vor allem, was soll denn passieren wenn er nicht angehalten ist? Willst Du dann das script anhalten? Den Server neu starten?

Du kannst
for /F "tokens=2" %%g in ('sc query %%f ^|findstr %%f') do for /F "tokens=4" %%h in ('sc query %%f ^|findstr STATE') do @echo %%h %%g >> %logfile%  

doch gerade noch einmal laufen lassen, und musst nur prüfen ob der Status für den Dienst gleich 1 ist. Wenn nicht .... siehe oben face-wink
Gruß
Nagus

Und hier wie's aussehen soll: ned die Lösung aber von der Formatierung

:: Umgebungsvariable setzen
set jahr=%date:~6,4%
set monat=%date:~3,2%
set tag=%date:~0,2%
set stunde=%time:~0,2%
set minute=%time:~3,2%
set sekunde=%time:~6,2%
set logfile="PFAD\%jahr%%monat%%tag%_%stunde%%minute%.log"  

::Zeitangabe für stoppen mitgeben
echo --------------------------------- >> %logfile%
echo %date% - %stunde%:%minute%:%sekunde% Uhr >> %logfile%
echo --------------------------------- >> %logfile%

::Dienstestop und Auslesen des Dienststatus
for %%f in (Dienst1 Dienst2 ....Dienst32) do (
sc stop %%f
sleep 3
for /F "tokens=2" %%g in ('sc query %%f ^|findstr %%f') do for /F "tokens=4" %%h in ('sc query %%f ^|findstr STATE') do @echo %%h %%g >> %logfile%  
)

echo --------------------------------- >> %logfile%

Dienstestart und Auslesen des Dienststatus
for %%f in ( Dienst1 Dienst2 ....Dienst32) do (
sc start %%f
sleep 3
for /F "tokens=2" %%g in ('sc query %%f ^|findstr %%f') do for /F "tokens=4" %%h in ('sc query %%f ^|findstr STATE') do @echo %%h %%g >> %logfile%  
)

:eof
60730
60730 05.03.2012 um 20:21:48 Uhr
Goto Top
Moin,
Ot
Zitat von @Nagus:
Moin,
kann es sein das mehr als zweimal code Formartierungen nicht gehen?
1
2
3
4
/ot

Gruss
Nagus
Nagus 06.03.2012 um 13:41:55 Uhr
Goto Top
Hi Timo,
OT
ich bin zu doof ... egal face-wink
/OT

Gruß
Nagus
60730
60730 06.03.2012 um 14:01:29 Uhr
Goto Top
Moin,

Zitat von @Nagus:
Hi Timo,

Salve face-wink

Nee nee schreiben wir mal andersherum, der TO wäre klüger beraten, wenn er nicht nur den Tipp von André anwenden würde, sondern auch - wenn er statt in zwei Blöcken jeweils Dienst1 Dienst2 Dienst3 reinmalt diese Dienstabsuche in einer separaten ini für beide Blöcke und mit nur einer Anpassung machen würde.

Feeddbäck in irgendeine Richtung wäre eigentlich auch ne Lösung

gruß
MMaiwald
MMaiwald 06.03.2012 um 21:08:54 Uhr
Goto Top
Hallo Nagus,

danke für die Formatierung
Werde ich beim nächsten Mal beachten.

Hier nochmal mein Gedankengang:

1. Dienste stoppen (ist mit diesem Skript schon getan)
2. Wenn Dienst 1 oder Dienst 32 nicht gestoppt ist, sollte eine Fehlerroutine diesen stoppen. Dies sollte 3x versucht werden. Erst dann sollte der nächste Dienst gestoppt werden.
3. Starten aller Dienste. Hier sollte ebenfalls eine Überprüfung eingebaut werden (wenn Dienst 1 nicht gestartet wurde, dann versuche dies 3 x und springe anschliessend zum nächsten Dienst)
4. Alles sollte natürlich auch weiterhin protokolliert werden.

Ich hoffe mich ein wenig verständlicher ausgedrückt zu haben.

Schönen Abend

Mario
Nagus
Nagus 07.03.2012 um 21:13:14 Uhr
Goto Top
Moin,
dann würde ich das anders machen:
  1. : Timo anwenden, d.h. am Anfang die Dienste definieren
  2. : den Status der Dienste abfragen --> hast du ja schon im Prinzip
  3. : definierte Dienste stoppen und warten ... das kann ja länger dauern
  4. : Status der Dienste abfragen, wenn der Dienst nicht 1 ist fehler setzen und ggf. hochzählen, nochmal versuchen
  5. : Dienste starten und den Zustand abfragen, wenn 1 email an Admin

fetisch .... so würde ich die logig umsetzen. mit deiner Schleife hast Du ja schon alles, musst es nur noch ausfeilen.

Aber mal ne ganz andere Frage: wäre es nicht besser und einfacher den Server neu zu starten und das nur einmal pro Woche oder so?
Wenn das mit den Dienste nämlich nicht geht, steht die Maschine u.U. ja auch ...

Gruß
Nagus
MMaiwald
MMaiwald 07.03.2012 um 22:52:02 Uhr
Goto Top
Hallo Nagus,

danke für die Anregungen

zu 1. verstehe nicht was Timo damit meint
zu 3. das Stoppen und Starten der Dienste dauert jetzt ca 4 Minuten. Das habe ich im Log ausgelesen...
zu 4. wie sollte das am besten gemacht werden? KAnnst du mal einen Tipp geben, wie die Abfrage aussehen soll. Wenn ich mich nicht täusche, könnte auch ein Taskill meinen Prozess stoppen und somit auch den Dienst stoppen oder irre ich da?
zu 5. Das mit der Mail habe ich mir auch so gedacht. Die Dienste werden eh überwacht und ich bekomme schon eine Mail. Nur möchte ich diese zur Sicherheit beim Fehlversuch ein zweites Mal starten. Hier bräuhte ich einen Ansatz, wie ich das am Besten machen könnte.

Der Serverreboot dauert ca 15 Minuten, bis dieser wieder Anfragen verarbeiten kann. Ich habe dieVorgabe bekommen, den Server nur am Wochenende neu zu starten und unter der Woche sollen nur die Dienste gestartet werden.
Eine Frage zu der for Schleife habe ich noch. Gibt es eine Möglichkeit, die Dienste 1-32 nicht so aufzulisten (for %%f in (Dienst1 Dienst2 ....Dienst32), sondern sich diese per Variable zu holen for %%f in ($Dienste). Die Dienstnamen unterscheiden sich vom angezeigten "Dienstnamen" unter Dienste.

Schönen Abend noch

Gruß
Mario
60730
60730 07.03.2012 um 23:16:06 Uhr
Goto Top
Salve

  • Timo meint, wenn du da was anpassen willst, mußt du Zeile 16 & Zeile 25 anpassen - jagst du die schleife(n) über eine Textdatei, mußt du die nur einmal anpassen.

  • 3 naja -was für dienste sind das denn überhaupt?
  • 4 ist die Batch und die Dienststoppkiste überhaupt das gleiche "Blech"?
  • 5 naja.... da halte ich es mit dem Kollegen André
Hilfe kommt später, nachdem du unsere <code></code>-Formatierung gefunden hast, bei Plaintext liest mein Hirn nur ...
  • 5b Die Dienstnamen unterscheiden sich vom angezeigten "Dienstnamen" unter Dienste.
Diese Namen sind doch nur Schall & Rauch, die Anzeigenamen nutzt doch keiner....
MMaiwald
MMaiwald 08.03.2012 um 22:44:04 Uhr
Goto Top
Hallo,

das mit den Dienstnamen aus der Datei herauslesen habe ich hinbekommen

set "config_dienste=D:\Test\dienste.conf"  

for /f "usebackq tokens=1" %%f in ("%config_dienste%") do (  
sc stop %%f 
sleep 3 
for /F "tokens=2" %%g in ('sc query %%f ^|findstr %%f') do for /F "tokens=4" %%h in ('sc query %%f ^|findstr STATE') do @echo %%h %%g >> %logfile%   
) 

Zitat von @Nagus:
  • Status der Dienste abfragen, wenn der Dienst nicht 1 ist fehler setzen und ggf. hochzählen, nochmal versuchen
Wie wird das gemacht? Kannst du mir ein Denkanstoss geben
Schön wäre es auch, wenn nach dem 2 Vesuch der Dienst gekillt wird (taskill)
* Dienste starten und den Zustand abfragen, wenn 1 email an Admin
Dienst Starten habe ich ja ach schon geschrieben, lediglich das mit dem Errorlevel fehlt mir
* Aber mal ne ganz andere Frage: wäre es nicht besser und einfacher den Server neu zu starten und das nur einmal pro Woche oder so?
Geht leider nicht.. Vorgabe vom Hersteller - Dienste müssen gestartet werden


Gruß
Mario
MMaiwald
MMaiwald 15.03.2012 um 16:57:07 Uhr
Goto Top
Hallo,

hat noch jemand eine Idee, wie ich den Errorlevel abfragen kann

Gruß
Mario