chappy
Goto Top

Processüberwachung

Hallo,

ich möchte gern Prozesse überwachen. Sobald die sich selbst beenden (Absturzt), muss eine message angezeigt werden! Leider handelt es sich bei dem Prozess um einen Unterprozess eines Tasks. Wenn man sich die Abbildung anschaut, müssen die javaw.exe processe überwacht werden.

970c8c35fd7078862120162dfe5810ee

Ich hoffe ihr könnt mir da weiterhelfen.

Gruss

chappy

Content-Key: 150244

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

Printed on: April 25, 2024 at 21:04 o'clock

Member: chappy
chappy Sep 07, 2010 at 09:53:34 (UTC)
Goto Top
Keiner der weiss wie?

ich hatte es bereits ausprobiert mit der Tasklist find.... aber das problem ist, dass alle 4 Prozesse gleich heissen, aber von unterschiedlichen Usern gestartet. Damit könnte man die unterscheiden. Aber leider weiss ich nicht wie man sowas in eine bat einbringen kann.

Danke
Member: bastla
bastla Sep 07, 2010 at 19:53:28 (UTC)
Goto Top
Hallo chappy!

Soferne ich Dich richtig verstehe, willst Du doch herausfinden, ob alle 4 Prozesse noch laufen - insofern würde ja ein Abzählen genügen:
@echo off & setlocal
for /f %%i in ('tasklist|find /c "jawaw.exe"') do set /a Anz=%%i  
If %Anz% neq 4 echo Mindestens ein Prozess laeuft nicht!
Grüße
bastla
Member: chappy
chappy Sep 08, 2010 at 10:07:29 (UTC)
Goto Top
Hallo bastla,

nicht so ganz. Ich wollte die processe überwachen und wenn einer nicht läuft, dann wird eine Mail versendet und der dazugehörige Dienst neugestartet.

Danke
chappy
Member: chappy
chappy Sep 10, 2010 at 05:17:18 (UTC)
Goto Top
Hallo zusammen,

ist hier niemand der weiss, wie man sowas machen könnte?

gruss
chappy
Member: chappy
chappy Sep 21, 2010 at 07:51:24 (UTC)
Goto Top
Hallo,

kann ich aus der Tasklist auch den Benutzer ermitteln? Wie kann ich dass machen?

danke gruss
chappy
Member: chappy
chappy Sep 21, 2010 at 08:58:11 (UTC)
Goto Top
Hallo,

bin schon einmal ein Schritt weiter. mittels:

tasklist /fi "username eq GEWAG\xrettubespg"  

kann ich schonmal die Prozesse des Users ermitteln. Also ich habe 6 Usernamen, jeder dieser 6 muss jeweils 2 Prozesse aufgelistet haben. ist die Anzahl <2, dann muss der dazugehörige Dienst neugestart werde. Das geht sollte mit net stop "Dienst" und net start "Dienst" gehen. So nun fehlt die Formulierung in eine batch, vielleicht kann ja jetzt jemand dabei helfen.

Danke und Gruss
chappy
Member: chappy
chappy Sep 21, 2010 at 10:44:18 (UTC)
Goto Top
Member: chappy
chappy Sep 21, 2010 at 10:45:45 (UTC)
Goto Top
Hallo,

hier mal meinen Ansatz:

@echo on & setlocal 

set Anz=2

for /f %%i in ('tasklist /fi "username eq Domaine\benutzer"') do  @set /a sum += 1   
echo %sum% -mal
If %sum% lss %Anz% (
echo Mindestens ein Prozess laeuft nicht!
net stop "Dienst"  
net start "Dienst"   
) else (
echo Alles ok! 
)

was ich nicht verstehje, warum zählt er 4? ich habe doch nur 2 Einträge in der taskliste. Wenn ich den Befehl

'tasklist /fi "username eq Domaine\benutzer"'  

im cmd eingebe, dann bekomme ich 2 Einträge, aber gezählt werden 4 Durchläufe der for-Schleife. Kann mir jemand sagen warum? Desweiteren wollte ich die einzelnen Prozesse mit den dazugehörigen benutzer in eine TXT-Datei ablegen, bisher sind es 8 Prozesse, so dass es 8 Zeilen in der TXT sein werden die wie folgt aussehen könnten:

1. Pfad_der_Anwendung.exe benutzername
2. Pfad_der_Anwendung.exe benutzername
3. Pfad_der_Anwendung.exe benutzername
4.

Danke vorab, in der Hoffnun, dass sich mal einer zu diesem Thema meldet.

Gruss
chappy
Member: bastla
bastla Sep 21, 2010 at 14:18:17 (UTC)
Goto Top
Hallo chappy!

Zumindest hinsichtlich
gezählt werden 4 Durchläufe der for-Schleife
hätte ich einen Hinweis: Gezählt werden ja alle Zeilen der "tasklist"-Ausgabe - wenn Du diese auf die tatsächlich Interessanten (mit "javaw.exe") beschränken willst, dann:
for /f %%i in ('tasklist /fi "username eq Domaine\benutzer"^|findstr "javaw\.exe"') do  set /a sum +=1
Deine zweite Frage ist mir nicht wirklich klar ("tasklist" liefert keinen Pfad) ...

Grüße
bastla
Member: chappy
chappy Sep 22, 2010 at 08:43:34 (UTC)
Goto Top
Hallo Bastla,

erst einmal danke, der Hinweis war richtig. es wurden tatsächlich die Zeilen gezählt. Jetzt klappt es auch.

Zu meiner 2ten Frage:

Ziel ist es:
ich prüfe, ob ein Prozess läuft, wenn das nicht der Fall ist, muss der dazugehörige Dienst neugestartet werden.
Da es sich hier um mindestens 8 Prozesse / Dienste handelt, die unterschiedlich heissen, stellt sich für mich die Frage, wie ich diese in eine TXT-Datei hinterlegen könnte.

Idee:
Die Txt-Datei beinhaltet den Benutzernamen des Prozesses zum identifizieren, ob dieser läuft und zum anderen den Dienstnamen, der ggf. neugestartet werden muss. Also der Inhalt könnte wie folgt lauten:

benutzername1 Dienstname1
benutzername2
Dienstname2
benutzername3 // Dienstname3
etc...

nun soll jeder einzelne Dienst geprüft werden. Ich poste gleich mal mein bisheriges Ergebnis:

@echo off & setlocal 

set "Dienste=D:\jobs\CheckProcess\Dienste.txt"  
set sum=0

for /f "usebackq tokens=1-2 delims=%Delim%" %%d in ("%Dienste%") do (   
	for /f %%i in ('tasklist /fi "username eq %%Benutzername"^|findstr "javaw\.exe"') do  @set /a sum += 1   
	If %sum%==0 (
	echo Der Prozess ist nicht vorhanden! %sum%
	date /t >> D:\Programme\test.txt
	time /t >> D:\Programme\test.txt
	net stop "%%Dienstname" >> D:\Programme\test.txt  
	net start "%%Dienstname" >> D:\Programme\test.txt  
	) else (
	echo Alles ok %sum%-mal! 
	)
)

das Problem ist, wie kann ich den benutzernamen auslesen und den an die richtige Stelle einsetzen und wie den Dienstnamen richtig auslesen und an die richtige Stelle einsetzen?

Danke dir
chappy
Member: bastla
bastla Sep 22, 2010 at 14:43:49 (UTC)
Goto Top
Hallo chappy!

Was Du dargestellt hast, nämlich die Kontrolle ob überhaupt ein "javaw"-Task für den angegebenen Benutzer läuft (und nicht die Kontrolle, ob es denn 2 wären), ließe sich einfacher realisieren:
@echo off & setlocal 

set "Dienste=D:\RETTube\jobs\CheckProcess\Dienste.txt"  

for /f "usebackq tokens=1* delims=%Delim%" %%d in ("%Dienste%") do (   
    tasklist /fi "username eq "%%d"^|findstr "javaw\.exe">nul && (  
        echo Alles ok! 
    )	|| (
        echo Der Prozess ist nicht vorhanden!
        date /t >> D:\Programme\test.txt
        time /t >> D:\Programme\test.txt
        net stop "%%e" >> D:\Programme\test.txt  
        net start "%%e" >> D:\Programme\test.txt  
    )
)
Soferne das Trennzeichen zwischen Benutzer- und Dienstnamen in der Textdatei ein TAB oder ein Leerzeichen ist, kannst Du "delims=%Delim%" weglassen, und wenn nicht, dann müsste dieses Trennzeichen der Variablen auch zugewiesen worden sein, also etwa
set "Delim=;"
Falls durch Leerzeichen getrennt wird, sorgt die Schreibweise "tokens=1*" dafür, dass nur das erste Leerzeichen (zwischen Benutzername und Dienstname) als Trennzeichen gilt und ev im Dienstnamen enthaltene weitere Leerzeichen letzteren nicht "auseinanderreißen" ...

Grüße
bastla
Member: chappy
chappy Sep 23, 2010 at 05:45:40 (UTC)
Goto Top
Hallo bastla,

erst einmal Danke für deine Mühe. Ich habe es noch nicht getestet, habe erst einmal sehen wollen, wo die unterschiede, zwischen den codes liegen. Eine Frage von mir ist, wann schreibt man dieses

>nul 

und was bewirkt das?
desweiteren, hatte ich auch versucht das

&& 

zu verwenden, aber es kam immer die Meldung, dass es ungültig an dieser Stelle ist. Handelt es sich hier um kein logisches UND? Wollte z.B. schreiben, wenn if-Bedingung1 && If-Bedingung2 erfüllt, dann schreibe ok vielleicht hatte ich ein do dahinter: do echo OK

Danke erst einmal.

chappy
Member: bastla
bastla Sep 23, 2010, updated at Oct 18, 2012 at 16:43:34 (UTC)
Goto Top
Hallo chappy!

Mit ">" wird eine "Ausgabeumleitung" vorgenommen - so kann die Ausgabe eines "echo" oder anderen Befehles in eine Datei, oder, wie in diesem Fall, zum "nul"-Device = ins Nichts vorgenommen werden - es wird damit die "normale" Ausgabe unterdrückt. Um auch Fehlermeldungen umzuleiten, wäre zusätzlich "2>&1" zu verwenden ...
Für die UND-Verknüpfung genügt einfach
if Bedingung 1 if Bedingung 2 Aktion
- hat aber eigentlich Biber hier schon mal gezeigt ...

Grüße
bastla
Member: chappy
chappy Oct 04, 2010 at 12:26:30 (UTC)
Goto Top
Hallo bastla,

danke für deine Antworten. Ich habe die Txt-Datei erweitert und somit nun 3 Values in einer Reihe stehen, welche durch ein ; getrennt sind.
Leider kann ich aber den 3ten Wert nicht auslesen. Das 3te ist ein Verzeichnis, worin geprüft werden muss, ob dort noch eine Datei liegt.

for /f "usebackq tokens=1* delims=;" %%d in ("%Dienste%") do (    
  echo d=%%d
  echo e=%%e
  echo f=%%f
  tasklist /fi "username eq %%d "|findstr "javaw\.exe">nul && (   
        echo Alles ok bei %%e %%d! 
    )	|| ( 
        echo Der Prozess %%e %%d fehlt! >> "%Log%"   
        date /t >> "%Log%"   
        time /t >> "%Log%"   
        NET STOP %%e >> "%Log%"   
        NET START %%e >> "%Log%"   
        cscript //nologo "%Msg%" "%%q\%%i" ...............(wenn *.csv im Ordner %%f liegt)  
   ) 
)

leider wusste ich das nicht zu formulieren. Wollte schreiben:

if exist %%i in ("%%f/*.csv") do cscript //nologo "%Msg%" "%%q\%%i"  

oder muss der Teil nach dem do in die zweite Rheie und in Klammer? Aber ich bekomme die Fehlermeldung, das %%f unbekannt ist, wie mache ich das?

Danke und Gruss
chappy
Member: bastla
bastla Oct 04, 2010 at 12:47:09 (UTC)
Goto Top
Hallo chappy!

Ein "%%f" kann es nicht geben, wenn mit "tokens=1*" festgelegt wird, dass alles nach dem ersten Trennzeichen (unabhängig von ev weiteren vorhanden Trennzeichen) als Einheit zu interpretieren ist - daher sollte es mit "tokens=1-3" oder, falls der angesprochene Verzeichnisname auch ";" enthielte, mit "tokens=1,2*", funktionieren ...

Grüße
bastla
Member: chappy
chappy Oct 04, 2010 at 13:32:36 (UTC)
Goto Top
Hallo Bastla,

herzlichen Dank, dass hat mir weitergeholfen. Es gibt noch ein Problem. Zunächst der Code

for /f "usebackq tokens=1,2* delims=%Delim%" %%d in ("%Dienste%") do (    
  echo d= %%d
  echo e= %%e
  echo f= %%f
  tasklist /fi "username eq %%d "|findstr "javaw\.exe">nul && (   
        echo Alles ok bei %%e %%d! 
    )	|| ( 
        echo Der Prozess %%e fehlt! >> "%Log%"   
        date /t >> "%Log%"   
        time /t >> "%Log%"   
        NET STOP %%e >> "%Log%"   
        NET START %%e >> "%Log%"   
		if exist %%i in "%%f/*.csv" (  
		cscript //nologo "%Msg%" "%%f\%%i"  
		echo %%i
	)
   ) 
)

Leider wird &&i nicht gefüllt, warum nicht und wie mache ich das?? ich bekomme in der email dann auch nur %%i als String angezeigt. Könntest du mir bitte sagen, wo ich den Fehler habe?

Danke

Chappy
Member: chappy
chappy Oct 05, 2010 at 06:54:45 (UTC)
Goto Top
Hallo bastla,

könntest du mir vielleicht noch ne ANtwort auf meine letzte Frage geben? Wäre Super

Gruss
chappy
Member: bastla
bastla Oct 05, 2010 at 07:23:52 (UTC)
Goto Top
Hallo chappy!

Wie sollte %%i zu einem Wert kommen? Die in Deinem Schnipsel verwendete Schleife liefert nur %%d, %%e und %%f ...

Und: Wie ist die Zeile 13 überhaupt gemeint?

Grüße
bastla
Member: chappy
chappy Oct 05, 2010 at 07:37:55 (UTC)
Goto Top
Hallo Bastla,

das ist mein bisheriger code. Momentan bekomme ich die Fehlermeldung:

C:\Dokumente und Einstellungen>set "Delim=;"
")" ist syntaktisch an dieser Stelle nicht verarbeitbar.

@echo on & setlocal  
 
set "Dienste=C:\Dienste1.txt"   
set "Log=C:\Errorlog.txt "  
set "Msg=C:\CheckProcessMailService.vbs"   
set "Delim=;"  


for /f "usebackq tokens=1,2* delims=%Delim%" %%d in ("%Dienste%") do (    
  echo d= %%d
  echo e= %%e
  echo f= %%f
  :loop
  tasklist /fi "username eq %%d "|findstr "javaw\.exe">nul && (   
        echo Alles ok bei %%e ! 
    )	|| ( 
        echo Der Prozess %%e fehlt! >> "%Log%"   
       
		if exist "%%i" in "%%f/*.csv" (  
		cscript //nologo "%Msg%" "%%f\%%i"  
		)
		
		date /t >> "%Log%"   
        time /t >> "%Log%"   
		NET STOP %%e >> "%Log%"   
        NET START %%e >> "%Log%"   
		::goto loop	
		) 
)

%%i soll die Datei sein, welche im Ordner %%f gefunden wird. So zumindest habe ich es in meinen anderen Beispielen. Was stimmt damit nicht?

Dank di für deine Mühe
chappy
Member: bastla
bastla Oct 05, 2010 at 07:40:46 (UTC)
Goto Top
Hallo chappy!
%%i soll die Datei sein, welche im Ordner %%f gefunden wird.
In diesem Fall müsste das so aussehen:
for %%i in ("%%f\*.csv") do cscript //nologo "%Msg%" "%%f\%%~nxi"
Grüße
bastla
Member: chappy
chappy Oct 05, 2010 at 10:17:04 (UTC)
Goto Top
Hallo Bastla,

herzlichen Dank für deine Unterstützung. könntest du mir vielleicht erklären, wo mein Gedankenfehler liegt? warum schreibst du %%~nxi ???und nicht %%i??

Gruss
chappy
Member: bastla
bastla Oct 05, 2010 at 12:39:15 (UTC)
Goto Top
Hallo chappy!

Du hattest zwei Befehle ("for" und "if exist") vermischt - das konnte so nicht klappen. Mit "if exist" lässt sich zwar die Existenz (auch unter Verwendung von Wildcards) von Dateien und Ordnern prüfen, wenn Du aber die einzelnen Namen / Pfade benötigst, ist die Schleife erforderlich ...
Bei einer "gewöhnlichen" "for"-Schleife erhältst Du in der Schleifenvariablen im Prinzip ein "Objekt" (bei "for /f" ist es nur ein String), wodurch "%%i" dann den gesamten Pfad der jeweiligen Datei enthält. Wenn Du nun nur den Dateinamen benötigst (der Ordner ist ja schon in "%%f" enthalten), pickst Du Dir eben die passenden Bestandteile "name" und "extension") heraus (siehe dazu ziemlich am Ende von "for /?").

Alternativ hättest Du natürlich auch nur "%%i" (ohne "%%f\" vorweg) verwenden können (aber dann hättest Du ja mit "%%~nxi" keine Bekanntschaft gemacht face-wink) ...

Grüße
bastla
Member: chappy
chappy Oct 07, 2010 at 13:38:32 (UTC)
Goto Top
Hallo bastla,

herzlichen Dank für deine Antwort und deine Hilfe. Dann haben wir das Thema nun auch erledigt.

Supi!
grusss
chappy