Avatar billede Haven Nybegynder
10. januar 2013 - 10:20 Der er 3 kommentarer og
1 løsning

Opstart af flere processor, samt monitorering og automatisk genstart

Hejsa,

Jeg er ved at (forsøge) udvikle et program, som skal have følgende funktioner:
1) Dynamisk opstart af programmer
2) Monitorering af disse efter de er startet
3) Ved crash skal, alt afhængigt af filen, den genstartes. Hvis det er en vigtig process, skal alle genstartes.

Jeg har indtil videre kommet frem til følgende.

Et dictionary, med parameterne til programmerne som skal startes.

Dictionary<string, dynamic> TestApps = new Dictionary<string, dynamic>
        {
            {"Calc",    new {fileName = "calc.exe", args = "0"}},
            {"cmd",    new {fileName = "cmd.exe", args = "0"}},
        };


Og jeg bruger følgende kode til, at starte programmerne med:


public void StartServer()
        {
            Thread thread = new Thread(() => InitServers());
            thread.Start();
        }

        private void InitServers() {
            foreach (KeyValuePair<String, dynamic> server in TestApps)
            {
                LaunchApplication(server.Value.fileName.ToString());
                Thread.Sleep(2000);
            }
        }

        public void LaunchApplication(string File)
        {
            Process p = new Process();
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = File;
            p.StartInfo = psi;
            p.EnableRaisingEvents = true;
            p.Start();
        }


Hvilket fungerer udemærket. Jeg er dog i tvivl og det er god praksis at gøre sådan?

Hvad jeg ikke har kunnet finde ud af, er hvordan jeg skal tjekke om processerne kører. Jeg har rodet lidt med Process.Exited, men har ikke kunnet finde en måde at bruge det dynamisk.

Jeg har fået foreslået, at sende en KeepAlive packet til programmerne, men er ikke helt sikker på hvordan dette gøres, og om det er 'stabilt'.

Jeg vil derfor høre, om der sidder nogle kloge hoveder som kan give mig et fingerpej i den rigtige retning :-)
Avatar billede arne_v Ekspert
10. januar 2013 - 12:59 #1
Maaske skulle du gemme en ref til Process objekterne og bruge deres properties.
Avatar billede janus_007 Nybegynder
10. januar 2013 - 20:03 #2
Du har kun 1 tråd til at starte alle processerne med, har du overvejet hvad der sker hvis den tråd chrasher?

Du burde måske lave en tråd/ task (ville jeg nok foretrække til hver application) og så lave en p.WaitForExit for hver start.

I din MainThread skal du så blot opsamle de forskellige PID's /handles og lave noget som chekker at de alle kører korrekt.
Avatar billede Haven Nybegynder
11. januar 2013 - 15:28 #3
Kan det lide sig gøre, at gemme process objekterne i det Dictionary jeg har lavet? Sådan at objektet ligger sammen med det entry den passer med.

@janus_007, havde jeg slet ikke tænkt på :-) Men har opdateret min kode, så den ser sådan ud:

Method jeg kalder ved klik på knap

public void StartServer()
{
  Thread thread = new Thread(() => InitServers());
  thread.Start();
}


Og til at starte det hele med:

private void InitServers() {
            shutdown = false;

            foreach (KeyValuePair<String, dynamic> server in TestApps)
            {
                ThreadStart start = delegate
                {
                    LaunchApp(server);
                };

                Thread t = new Thread(start);
                t.Start();

                Thread.Sleep(2000);
            }
           
            serverStarted = true;
        }

private void LaunchApp(KeyValuePair<String, dynamic> obj)
        {

            if (serverStarted)
            {
                //ERROR SERVER ALREADY ON
                //REBOOT INSTEAD?
            }
            else
            {
                string File = obj.Value.fileName.ToString();
                Process p = new Process();
                ProcessStartInfo psi = new ProcessStartInfo();
                psi.FileName = File;
                p.StartInfo = psi;
                p.EnableRaisingEvents = true;
                p.Exited += new EventHandler(CrashHandler);
                p.Start();
            }
        }

        private void CrashHandler(object sender, System.EventArgs e)
        {
            Process p = (Process)sender;
            if(!shutdown)
                p.Start();
        }


Vil dette være en OK måde, at gøre det på?
I mine tests virker det til, at fungere okay. Når programmet lukkes ned, så starter den det automatisk igen.

Programmet skal bruges til at styre en spilserver, stabilitet er derfor vigtigt. Flere af exe filerne er afhængige af hinanden, og hvis en type crasher, skal alle af samme type genstartes. Men dette tager jeg, når jeg har fået styr på det andet :-)
Avatar billede janus_007 Nybegynder
11. januar 2013 - 20:12 #4
Ja det ser langt bedre ud :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester