Prozess killen & den gleiche Prozess neu Starten

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Mikebazz.

    Prozess killen & den gleiche Prozess neu Starten

    Hallo, ich benötige eure Hilfe in Verbindung mit Prozesse.

    Ich möchte per VB08 - Konsolenanwendung z.B. einen beliebigen Prozess "killen" und nach einigen Sekunden den Prozess wieder neu Starten lassen. Und das soll der jede Stunde einmal checken ob dieser Prozess läuft oder nicht. Wenn er nicht läuft soll er gestartet werden.

    Ihr könnt als Beispiel Prozess "Skype" benutzen.

    Hoffe ihr könnt mir schnell weiterhelfen.

    Danke, im vorhinein.
    Mikebazz
    Hey,

    dazu am besten eine Schleife bilden die alle Prozesse durchgeht.


    Mit If fragst du .Processname ab, wenn der Prozessname zutriffst musst Du
    den Pfad der .Exe vom Prozess zwischenspeichern(String Variable).

    Wenn der Prozess gekillt ist, einfach wieder Process.Start(StringVariable)

    Anoth3rB0y schrieb:

    Hey,

    dazu am besten eine Schleife bilden die alle Prozesse durchgeht.


    Mit If fragst du .Processname ab, wenn der Prozessname zutriffst musst Du
    den Pfad der .Exe vom Prozess zwischenspeichern(String Variable).

    Wenn der Prozess gekillt ist, einfach wieder Process.Start(StringVariable)

    Ok. Kannst du mir evtl. auch einen gebrauchbaren Code dazu schicken? Der aber das jede Stunde einmal wiedeholt das darf man nicht vergessen.
    Timer mit 3600000 als Interval (1 Std)
    im Timer mit einer Schleife die gestarteten Prozesse auflisten (msdn.microsoft.com/de-de/library/z3w4xdc9%28v=vs.80%29.aspx)
    anschließend mit der Prozess Klasse (msdn.microsoft.com/de-de/library/ccf1tfx0%28v=VS.80%29.aspx) den Prozess beenden/starten.

    Bisschen Eigeninitiative muss schon vorhanden sein.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    VB.NET-Quellcode

    1. Dim ms As System.Management.ManagementScope = New System.Management.ManagementScope("\\LocalHost\roo t\cimv2")
    2. ms.Options.EnablePrivileges = True
    3. Dim oq As System.Management.ObjectQuery = New System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem")
    4. Dim query1 As System.Management.ManagementObjectSearcher = New System.Management.ManagementObjectSearcher(ms, oq)
    5. Dim queryCollection1 As System.Management.ManagementObjectCollection = query1.Get()
    6. For Each mo As System.Management.ManagementObject In queryCollection1
    7. Dim ss As String() = {"2", "0"} ' kill and restart the process
    8. 'Dim ss As String() = {"2", "2"} ' start process
    9. 'Dim ss As String() = {"0", "0"} ' kill process
    10. mo.InvokeMethod("Win32Shutdown", ss)
    11. Next


    viel spaß mit dem Code

    Mikebazz schrieb:

    Ok. Kannst du mir evtl. auch einen gebrauchbaren Code dazu schicken? Der aber das jede Stunde einmal wiedeholt das darf man nicht vergessen.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Threading
    3. Module Module1
    4. Dim D As Thread
    5. Sub Main()
    6. Startt()
    7. Console.ReadLine()
    8. End Sub
    9. Private Sub Startt()
    10. D = New Thread(Sub()
    11. While True
    12. KillandRestart("skype")
    13. Thread.Sleep(3600000)
    14. End While
    15. End Sub)
    16. D.IsBackground = True : D.Start()
    17. End Sub
    18. Private Sub Stopp()
    19. Try
    20. D.Abort()
    21. Catch
    22. End Try
    23. End Sub
    24. Private Sub KillandRestart(ByVal P As String)
    25. Dim R As String = String.Empty
    26. If Process.GetProcessesByName(P).Length > 0 Then
    27. For Each t As Process In Process.GetProcessesByName(P)
    28. R = t.MainModule.FileName
    29. Try
    30. t.Kill()
    31. Catch ex As Exception
    32. Console.WriteLine(CStr(ex.Message))
    33. End Try
    34. Next
    35. End If
    36. Process.Start(R)
    37. End Sub
    38. End Module




    Wenn noch Fragen zum Code bestehen, poste sie :)
    Ah mist.

    Du hast ja Vb 2008 , hab ich nicht dran gedacht. Da geht Inline noch nicht so in der Form.

    Mach mal in Sub Main() so:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim D As New Thread(AddressOf Startt)
    3. D.IsBackground = True : D.Start()
    4. Console.ReadLine()
    5. End Sub



    Start Sub So:

    VB.NET-Quellcode

    1. Private Sub Startt()
    2. While True
    3. KillandRestart("skype")
    4. Thread.Sleep(3600000)
    5. End While
    6. End Sub
    Nimm eine Form-Anwendung!
    Wenn Du den Prozess wieder starten willst, können wir doch getrost davon ausgehen, dass er bei Programmstart nicht läuft, Du ihn also per Programm selbst startest.
    Probier folgendes:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private prc As Process
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. prc = New Process
    5. prc.StartInfo.FileName = "notepad.exe" ' oder Dein Programm
    6. prc.Start()
    7. End Sub
    8. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    9. If (Not prc.HasExited) Then
    10. prc.Kill()
    11. prc.Start()
    12. End If
    13. End Sub
    14. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Nimm eine Form-Anwendung!
    Wenn Du den Prozess wieder starten willst, können wir doch getrost davon ausgehen, dass er bei Programmstart nicht läuft, Du ihn also per Programm selbst startest.
    Probier folgendes:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private prc As Process
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. prc = New Process
    5. prc.StartInfo.FileName = "notepad.exe" ' oder Dein Programm
    6. prc.Start()
    7. End Sub
    8. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    9. If (Not prc.HasExited) Then
    10. prc.Kill()
    11. prc.Start()
    12. End If
    13. End Sub
    14. End Class

    Danke. An euch alle. ;) Ich werde mir den Conde jetzt einprägen und lernen. Das ich auch etwas davon kann.

    Mikebazz schrieb:

    Danke. An euch alle. ;) Ich werde mir den Conde jetzt einprägen und lernen. Das ich auch etwas davon kann.

    Codes einprägen ist beim programmieren nie gut.

    Stell Dir vor, Du hast irgendwann ein Programm, mit 700 Zeilen Code.

    Denkst Du, du kannst dir jede Zeile einprägen?

    Das bringt dir nichts. Du musst Logik und Verständnis entwickeln.

    Nur so ein Tipp^^

    Anoth3rB0y schrieb:

    Stell Dir vor, Du hast irgendwann ein Programm, mit 700 Zeilen Code.
    Denkst Du, du kannst dir jede Zeile einprägen?

    Stell Dir vor, Dein Programmpaket hat 100000 Zeilen und Du weißt, wo Du was finden kannst. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!