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-Key: 181448

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

Printed on: April 24, 2024 at 07:04 o'clock

Member: Skyemugen
Skyemugen Mar 05, 2012 at 16:27:41 (UTC)
Goto Top
Aloha,

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

greetz André
Member: Nagus
Nagus Mar 05, 2012 at 16:48:42 (UTC)
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
Mitglied: 60730
60730 Mar 05, 2012 at 19:21:48 (UTC)
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
Member: Nagus
Nagus Mar 06, 2012 at 12:41:55 (UTC)
Goto Top
Hi Timo,
OT
ich bin zu doof ... egal face-wink
/OT

Gruß
Nagus
Mitglied: 60730
60730 Mar 06, 2012 at 13:01:29 (UTC)
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ß
Member: MMaiwald
MMaiwald Mar 06, 2012 at 20:08:54 (UTC)
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
Member: Nagus
Nagus Mar 07, 2012 at 20:13:14 (UTC)
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
Member: MMaiwald
MMaiwald Mar 07, 2012 at 21:52:02 (UTC)
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
Mitglied: 60730
60730 Mar 07, 2012 at 22:16:06 (UTC)
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....
Member: MMaiwald
MMaiwald Mar 08, 2012 at 21:44:04 (UTC)
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
Member: MMaiwald
MMaiwald Mar 15, 2012 at 15:57:07 (UTC)
Goto Top
Hallo,

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

Gruß
Mario