Announcement

Collapse
No announcement yet.

Probleme mit StandardInput eines Prozesses

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit StandardInput eines Prozesses

    Hallo allerseits,

    ich versuche momentan ein kleines Tool zu schreiben, mit dem man Zeitgesteuert Windows-Dienste neu starten kann.
    Nun werden einige vielleicht denken: Warum benutzt er nicht einfach den Taskplaner und eine Batch-Datei mit "net stop" und "net start"?
    Nunja, ganz einfach: Manche der neu zu startenden Dienste haben Abhängigkeiten zu anderen Diensten und es kommt eine kleine aber feine Abfrage ob diese mitbeendet werden sollen (J/N). Ja das sollen sie. Des Weiteren werden die Dienste aufgelistet, die in Abhängigkeit zu dem zu beendenden Dienst stehen. Diese muss ich ja dann dementsprechend auslesen und später alle (den ursprünglichen und die in Abhängigkeit stehenden Dienste) starten.

    Ich nutze die allgemein bekannte Art und Weise "net" mit den Argumenten "stop" bzw. "start" und dem Namen des Dienstes, in einem eigenen Prozess zu starten und nutze StandardOutput, ~Error und ~Input um die Streams Auszulesen bzw. die evtl. anfallenden Abfragen (hier nur "J/N") abzudecken:
    Code:
    void t_Elapsed(object sender, ElapsedEventArgs e)
            {
                ProcessStartInfo stop = new ProcessStartInfo();
                stop.FileName = "Net";
                stop.Arguments = "stop \"" + Dienst + "\"";
                stop.CreateNoWindow = true;
                stop.UseShellExecute = false;
                stop.RedirectStandardOutput = true;
                stop.RedirectStandardInput = true;
                stop.RedirectStandardError = true;
    
                ProcessStartInfo start = new ProcessStartInfo();
                start.FileName = "Net";
                start.Arguments = "start \"" + Dienst + "\"";
                start.CreateNoWindow = true;
                start.UseShellExecute = false;
                start.RedirectStandardOutput = true;
                start.RedirectStandardError = true;
    
                Process Net;
    
                now = e.SignalTime;
    
                if ((Einmalig == false &&
                     now.Hour == dt.Hour &&
                     now.Minute == dt.Minute) ||
                    (Einmalig == true &&
                     now.Year == dt.Year &&
                     now.Month == dt.Month &&
                     now.Day == dt.Day &&
                     now.Hour == dt.Hour &&
                     now.Minute == dt.Hour))
                {
                    Net = new Process();
    
                    Net.StartInfo = stop;
                    Net.Start();
    
                    System.IO.StreamReader myError = Net.StandardError;
                    System.IO.StreamWriter myInput = Net.StandardInput;
                    
                    if (Andere == true)
                    {
                        myInput.WriteLine("J");
                    }
                    else
                    {
                        myInput.WriteLine("N");
                    }
                    myInput.Flush();
    
                    System.IO.StreamReader Returning = new System.IO.StreamReader(Net.StandardOutput.BaseStream, System.Text.Encoding.Default);
                    List<String> sl = new List<string>();
                    sl.Add(Dienst);
    
                    String Line = Returning.ReadLine();
                    while (!Line.Equals(""))
                    {
                        WriteToLog(Line);
                        Line = Returning.ReadLine();
                    }
                        
                    while (!Returning.EndOfStream)
                    {
                        string s = Returning.ReadLine().Trim();
                        WriteToLog(s);
                        if (s.Equals(""))
                            break;
                        sl.Add(s);
                    }
                    while (!Returning.EndOfStream)
                        WriteToLog(Returning.ReadLine());
    
                    while (!myError.EndOfStream)
                        WriteToLogAsError(Returning.ReadLine());
    
                    Net.WaitForExit();
    
                    Returning.Close();
    
                    
                    foreach (string sitem in sl)
                    {
                        Net = new Process();
                        
                        start.Arguments = "start \"" + sitem + "\"";
                        Net.StartInfo = start;
                        Net.Start();
                        Returning = new System.IO.StreamReader(Net.StandardOutput.BaseStream, System.Text.Encoding.Default);
                        myError = new System.IO.StreamReader(Net.StandardError.BaseStream, System.Text.Encoding.Default);
                        while (!Returning.EndOfStream)
                        {
                            WriteToLog(Returning.ReadLine().Trim());
                        }
                        while (!myError.EndOfStream)
                        {
                            WriteToLog(myError.ReadLine().Trim());
                        }
    
                        Net.WaitForExit();
                        Returning.Close();
                    }
                    
                }
            }
    Mein Programm funktioniert soweit auch gut. D.h. wenn ich einen Dienst neu starten will, der keine anderen Abhängigkeiten hat, läuft alles einwandfrei.
    Habe ich nun allerdings einen Dienst mit Abhängigkeiten, endet das ganze bei der eigentlichen "J/N"-Eingabe. Leider finde ich bei mir auf dem Rechner, mit dem ich Programmiere, keinen Dienst, der solche Abhängigkeiten aufweißt. Diese habe ich nur auf dem Server, auf dem das Tool später eingesetzt werden soll. Somit ist es mir leider nicht Möglich richtig zu Debuggen und muss mich auf mein ErrorLog verlassen, mit dem ich in eine Textdatei den Output und die Errors des Prozesses schreibe.
    Hierbei kommt bei einem unabhängigen Dienst:
    [Dienst] wird beendet
    [Dienst] wurde beendet
    [Dienst] wird gestartet
    [Dienst] wurde gestartet

    Hier gibt es keine Error-Ausgabe

    bei einem Dienst mit Abhängigkeiten kommt:
    Die folgenden Dienste hängen vom Dienst Microsoft Exchange-Systemaufsicht ab.
    Das Beenden des Dienstes Microsoft Exchange-Systemaufsicht beendet auch diese Dienste.
    Microsoft Exchange MTA-Stacks
    Microsoft Exchange-Ereignis
    Microsoft Exchange-Informatonsspeicher

    Möchten Sie diesen Vorgang fortsetzen? (J/N) [N]:

    Im Anschluss daran dann vom Error-Output über 60000 Leerzeilen.


    Ich habe das Gefühl es kommen über den Inputstream dann in einer endlosschleife nur falsche Eingaben, oder irgendwas in der Art.
    Ich bin völlig ratlos und vielleicht auch schon Blind und übersehe nur eine Kleinigkeit.


    Ich wär echt froh, wenn mir jemand von euch weiterhelfen könnte. Ein Tip ob man mit dem StadardInput anders umgehen muss, oder iiiirgendetwas


    Gruß,
    Athlone
Working...
X