1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Windows Prozess neustarten

Discussion in 'Programmieren' started by daniel0290, Apr 29, 2008.

Thread Status:
Not open for further replies.
  1. daniel0290

    daniel0290 Kbyte

    Hallo zusammen,

    ich habe folgendes Problem:

    Auf einem Server (Win2003) läuft ein Programm (xxx.exe). Dieses hängt sich ab und zu auf und verschwidet, sollte aber die ganze Zeit laufen ohne, dass ich kontrollieren muss, dass es läuft. Kann man per Skript (Batch, o.ä.) testen, ob der Prozess existiert und bei Bedarf neu starten? Ich habe es mit Batch versucht, aber ich finde keinen Befehl, der testet, ob der prozess existiert.

    Danke schonmal

    Gruß daniel0290
     
  2. Falcon37

    Falcon37 Ganzes Gigabyte

    Es gibt Programme, die lassen nur eine aktive Instanz zu.
    Probier mal aus, ob das bei deinem auch so ist, wenn ja dann
    kannst du einfach per Scheduler alle x-Minuten das Programm
    neu starten.

    Mfg
     
  3. mike_kilo

    mike_kilo Ganzes Gigabyte

    Ich kenne Win2k3 nicht, aber :
    Könnte man nicht die App. als WinDienst starten lassen, und bei Dienstausfall diesen neustarten lassen? Ähnlich wie unter XP-Pro.Es gibt hierbei mehrere restart-Optionen.
     
  4. Urs2

    Urs2 Megabyte

    Was heisst "verschwindet"?
    Schliesst es sich komplett oder bleibt es "aufgehängt" im System?
    Im letzteren Fall müsste es es vor einem neuen Aufruf ja zuerst gekillt werden...

    Wenn das Programm mit einem Script aufgerufen wird, kann der das Schliessen abwarten... und es dann wieder neu starten.
    Wenn es sich aufhängt wahrscheinlich auch, aber da müsste ich zuerst einen Weg suchen... einen automatischen Rückgabewert oder von Zeit zu Zeit einen Aufruf, ob es noch funktioniert...

    Gruss Urs
     
  5. daniel0290

    daniel0290 Kbyte

    Mein Ziel ist es von Zeit zu Zeit dieses Tool aufzurufen, das checkt, ob der prozess vorhanden ist und ihn ggf. neu startet. Es ist kein Dienst. Einfach nur eine Datei die zu einem Programm gehört, dass Daten mit dem Server abgleicht. Wenn es abstürzt, ist der prozess komplett beendet. (Er hängt sich nicht auf, weil das eig. der Normalzustand dieses Skripts ist. Muss keine verstehen.)
    also grob soll das so aussehen (Syntax nicht beachtet):
    if %Prozess% vorhanden goto end
    else goto neustart
    :neustart
    start %Prozess%
    :end
    exit

    Dieser Skript ist so einfach, dass man natürlich auch mehrere Instanzen starten kann was zu Problemen führt, da sich diese dann nicht absprechen und Fehler entstehen.
     
  6. Urs2

    Urs2 Megabyte

    Warum sollte sie auch, beim letzten Test war ich immer noch ein Mann...
    Aber Dein ominöses "Ding" hat doch sicher auch einen Familiennamen > EXE, VBS, BAT oder sonst etwas Ausführbares?

    Wenn es ein Script ist, müsste der doch zuerst selbst dafür sorgen, dass er keinen Selbstmord begehen kann...

    Mit Deinem "Ding" als EXE oder VBS funktioniert es so > Start des "Dings" mit dieser DING.VBS >

    Code:
    Dim objShell
    Set objShell = CreateObject("WScript.Shell")
    	
    Do
    	'lädt das "Ding" und wartet auf seine Beendigung
    	'"Chr(34) &" ist nötig, wenn Pfad Leerzeichen enthält, sonst nicht
    objShell.Run Chr(34) & "X:\Pfad\Zu Deinem\Ding\DeinDing.prg?", 4, True
    	'wenn beendigt > wird das "Ding" wieder geladen und gewartet, auf seine Beendigung...
    Loop	
    
    Bedingungen:

    - So funktioniert es unter XP, unter Server2003 wohl auch, aber trotzdem > Testen!
    - Das "Ding" beendet sich normal, wenn es abgewürgt oder erschlagen wird, gibt es vielleicht einen anderen oder gar keinen Rückgabewert. Ob es dann noch funktioniert? Testen!

    Die Ding.vbs lädt Dein "Ding.prg?"... und wenn jenes beendet wird, wieder... und wieder... und wieder...
    Töten lässt sich Ding.vbs nur im TaskManager/ProcessExplorer...

    Gruss Urs
     
  7. daniel0290

    daniel0290 Kbyte

    sry....tippfehler...ich wollte "keiner" schreiben

    Das "Ding", dass ich jtzt efach mal "Skript" taufe, soll nur z.B. ein mal pro Stunde ausgeführt werden und testen, ob der Prozess läuft und ihn ggf. neu starten. Danach soll sich der Skript selbst "töten". Ich kenn mich nicht so gut aus mit VBS....wenn jemand eine gute (Lern-)quelle kennt, möge er diese bitte hier posten. danke
     
  8. Urs2

    Urs2 Megabyte

    Da Du aus unerfindlichen Gründen einfach nicht schreiben willst, was für eine Art Anwendung/Prozess denn überwacht werden soll, musste ich es halt "Ding" taufen. Denk Dir für "Ding" den Namen dieser absturzgefährdeten Geheim.exe, Secret.vbs oder wie sie auch heissen mag.

    Um zu entwirren nennen wir jetzt den noch zu erstellende VBScript, mit meinem Code, nicht wie oben Ding.vbs sondern Neustart.vbs...

    Wenn der Server gestartet wird, muss irgendjemand das verdammte "Ding" auch starten, sei das nun ein Mensch oder ein Autostart - sonst könnte es ja auch nicht abstürzen...

    Meine Neustart.vbs kontrolliert nichts, sie startet das "Ding" und wartet bis es abstürzt. Dann startet sie das "Ding" wieder, und wartet wieder bis es abstürzt, dann...
    Das funktioniert aber nur, wenn beim Hochfahren des Servers meine Neustart.vbs das "Ding" selbst starten kann.

    Anstatt das "Ding" zu starten muss einfach die Neustart.vbs gestartet werden, die kümmert sich dann um den Rest.
    In der Neustart.vbs muss nur der komplette Pfad zum "Ding" zwischen die Anführungszeichen eingetragen werden...

    Wenn Du aber wirklich keine Ahnung hast, dann lass vielleicht besser den Besitzer des Servers das überprüfen...

    Gruss Urs
     
  9. daniel0290

    daniel0290 Kbyte

    Ich hab's ausprobiert und es funktioniert............nur leider darf auf keinen fall der Script 2x geöffnet werden, weil der dann wahllos weiter öffnet. Kann man da nochwas mchen, weil es geht dich um SBS2k3 und, wenn d mal zufällig einer den Administrator 2x anmeldet, wird der Script nochmal gestartet. Der Fehle ist schonmal passiert, nur bei diesem Script müsste man den Server neu starten, was natürlich schlecht ist.
     
  10. Urs2

    Urs2 Megabyte

    ..Vorschlag gelöscht... stimmt nicht... muss nochmals über die Bücher... in der Nacht...
     
  11. Urs2

    Urs2 Megabyte

    > Ich weiss immer noch nicht, wie das "Ding" denn vorher gestartet wurde... manuell oder Autostart?
    > Das "Ding" darf jetzt gar nicht mehr direkt gestartet werden, nur noch über die Neustart.vbs
    > Ich vermute, dass Du die Neustart.vbs jetzt in einen Autostart legst?

    Das Ueberprüfen, ob die Neustart.vbs schon läuft, ist nicht direkt möglich.
    Sie ist selbst kein Prozess, sondern startet den Prozess wscript.exe, der dann den Code ausführt.
    Jeder Script startet eine neue, eigene wscript.exe, man kann also direkt nicht wissen, welches die richtige ist...

    Im Klartext:
    Die Neustart.vbs muss vor dem Starten prüfen, ob das "Ding" aktiv ist. Wenn Nein, dann startet sie das "Ding". Wenn Ja, bricht sie ihre Arbeit ab.

    Bevor ich mir weiter Mühe gebe musst Du Dein Geheimnis offenbaren > Was ist das "Ding"? Eine EXE oder auch ein VBS?
    Bei einer EXE kann man prüfen ob sie geladen ist.
    Bei einem VBS, wie eben erklärt, ginge das vermutlich nur mit einer Hilfskonstruktion.

    Gruss Urs
     
  12. daniel0290

    daniel0290 Kbyte

    Das "Ding" ist eine EXE und wird bislang durch den Autostart von Windows gestartet, allerdings ist dies änderbar.
    Genau diese Funktion wollte ich anfangs jede Stunde nutzen um den zu Prüfen, ob die EXE läuft oder nicht und dann den Befehl "neustart" oder "kein neustart" ausführen. Deine aktuelle Neustart-Lösung nimmt auch Speicher in anspruch für die ganze Zeit. Besser wäre den Test nur regelmäßig starten zu lassen und ansonsten gar nicht aktiv.
    Die EXE prüfen und ggf. neu starten. Mehr nicht. Den rest sollte ich über windows regeln können (vllt. über Task-Manager oder so). Dake für deine tolle Hilfe!!!
     
  13. Urs2

    Urs2 Megabyte

    Und das war so ein Geheimnis?
    Also, ich nenne das "Ding" jetzt Ding.exe, und mein Code bleibt in der Neustart.vbs.

    Ich habe den Code unter XP getestet, vermutlich funktioniert er auch unter Server2003 >> Nur Testen hilft!

    Neustart.vbs >
    Code:
    Dim objShell, strComputer, strProcess
    Set objShell = CreateObject("Wscript.Shell")
    strComputer = "COMPUTERNAME"
    strProcess = "Ding.exe"
    
        If IsProcessRunning (strComputer,strProcess) = True Then
            Wscript.Quit
        Else
            objShell.Run Chr(34) & "x:\Kompletter Pfad\Zu\Der\Ding.exe"
        End If
    
        If Err.Number <> 0 Then
            wshShell.Popup "Fehler: " & Err.Description,60,"Error"
        End If
    
    
    Function IsProcessRunning(strComputer,strProcess)
        'Accepts a computer name and process name as string parameters.
        'Returns TRUE if the passed process is running, FALSE otherwise.
    	Dim objWMIService, wshShell
    	Set objWMIService = GetObject("winmgmts:\\" & strComputer _
    	 & "\root\cimv2")
    	Set wshShell = CreateObject("Wscript.Shell")
    	IsProcessRunning = False
    	On Error Resume Next
    	Set colProcesses = objWMIService.ExecQuery _
    	 ("Select * from Win32_Process Where Name = '" _
    	  & strProcess & "'")
    	If Err.Number = 0 Then
    	 	If colProcesses.Count <> 0 Then
    			IsProcessRunning = True
    			Exit Function
    	   	End If
    	Else
    	   	MsgBox "An error occurred: " & Err.Description
    	End If
    End Function
    
    strComputer = Name des Computers wo die Ding.exe läuft, genau so geschrieben wie es dort steht
    strProcess = Ding.exe, geschrieben wie sie im Taskmanager steht

    Der Script startet und prüft ob die Dinge.exe läuft. Wenn Ja bricht er ab, wenn Nein lädt er die Ding.exe

    Man könnte noch eine Sleep-Funktion einbauen, dann prüft der Script nach einer gewissen Zeit wieder...
    Aber das würde wieder ein paar Bytes kosten,,,

    Gruss Urs
     
  14. Falcon37

    Falcon37 Ganzes Gigabyte

    Ich würde erstmal den Tipp in #2 ausprobieren.
    Vielleicht kann man sich das Script dann sparen.
    Aber wenn's niemanden interessiert, auch gut.
     
  15. Urs2

    Urs2 Megabyte

    Das geht ja eben nicht, siehe #9

    Gruss Urs
     
  16. daniel0290

    daniel0290 Kbyte

    Danke für die Hilfe..Was ich noch sagen wollte.....In #1 steht:
    damit wird die Frage, was das ist wohl überflüssig
    Ich wollte kein Geheimnis draus machen. :sorry: Ich teste es natürlich. Das sieht genauso aus, wie ich mir die Funktion vorgestellt habe. "IsProcessRunning" war der ganze Knackpunkt dabei. Danke :bet::bet:
     
  17. Urs2

    Urs2 Megabyte

    Naja, ich habe mir schon einen Eimer voll Asche besorgt... diese werde ich mir jetzt aufs Haupt streuen....

    Es würde mich freuen, von Dir zu hören, ob das VBS jetzt auch nutzbar und nützlich ist.
    2003 Server kenne ich nicht. Was unter XP geht, dürfte aber wohl auch dort gehen. Deshalb meine Bitte...

    Gruss Urs
     
  18. daniel0290

    daniel0290 Kbyte

    Sollte kein Vorwurf sein...nur ein Hinweis...:)

    Ich geb dir natürlich bescheid, hab's aber leider bisher auch nur unter XP testen können, weil der Server nicht bei mir zu Hause steht und bisher die zeit fehlte. Ich denke aber schon positiv. Danke für die Mühe!!!
     
  19. daniel0290

    daniel0290 Kbyte

    SO....jetzt hab ich das mal getestet und es sieht bisher ganz gut aus. Der Taskmanager vom Server ruft alle 60 min. den Skript auf und der startet der Prozess neu und/oder schließt sich selbst. Super!!! Danke nochmal. Hast mir echt geholfen...!!!
     
Thread Status:
Not open for further replies.

Share This Page