Exemple #1
0
        public static int Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(HangmanService)))
            {
                var security = new SecurityMode();
                host.AddServiceEndpoint(
                    typeof(IHangmanService),
                    new WSHttpBinding(security, true),
                    "http://localhost:8325/");

                host.Open();

                /*
                 * Console.WriteLine ("Type [CR] to stop ...");
                 * Console.ReadKey ();
                 */

                /* Demon */
                UnixSignal    sigint  = new UnixSignal(Signum.SIGINT);
                UnixSignal    sigterm = new UnixSignal(Signum.SIGTERM);
                UnixSignal    sighup  = new UnixSignal(Signum.SIGHUP);
                UnixSignal    sigusr2 = new UnixSignal(Signum.SIGUSR2);
                UnixSignal [] signals = new UnixSignal[]
                {
                    sigint,
                    sigterm,
                    sighup,
                    sigusr2
                };

                bool exit = false;
                while (!exit)
                {
                    int id = UnixSignal.WaitAny(signals);

                    if (id >= 0 && id < signals.Length)
                    {
                        if (sigint.IsSet || sigterm.IsSet)
                        {
                            sigint.Reset();
                            sigterm.Reset();
                            exit = true;
                        }
                        else if (sighup.IsSet)
                        {
                            sighup.Reset();
                        }
                        else if (sigusr2.IsSet)
                        {
                            sighup.Reset();
                        }
                    }
                }
                /* Demon */

                host.Close();
            }

            return(0);
        }
Exemple #2
0
        void ListenForSignal()
        {
            try
            {
                var          intr    = new UnixSignal(Signum.SIGINT);
                var          term    = new UnixSignal(Signum.SIGTERM);
                var          hup     = new UnixSignal(Signum.SIGHUP);
                var          usr2    = new UnixSignal(Signum.SIGUSR2);
                UnixSignal[] signals = { intr, term, hup, usr2 };

                _logger.Info("Start listening for unix signals");

                for (_running = true; _running;)
                {
                    var idx = UnixSignal.WaitAny(signals, 1000);
                    if (idx < 0 || idx >= signals.Length)
                    {
                        continue;
                    }
                    if (!_running)
                    {
                        return;
                    }

                    _logger.Info("LinuxSignal: received signal " + signals[idx].Signum);

                    if ((intr.IsSet || term.IsSet))
                    {
                        intr.Reset();
                        term.Reset();

                        _logger.Info("LinuxSignal: stopping...");

                        _running = false;
                        OnExit();
                        Environment.Exit(0);
                    }
                    else if (hup.IsSet)
                    {
                        // Ignore. Could be used to reload configuration.
                        hup.Reset();
                    }
                    else if (usr2.IsSet)
                    {
                        usr2.Reset();
                        // do something
                    }
                }
            }
            catch
            {
                _logger.Info("Unable to listen on unix signals");
            }
            _logger.Info("Finished listening to unix signals");
        }
Exemple #3
0
        public void TestDispose2()
        {
            UnixSignal a = new UnixSignal(Signum.SIGINT);
            UnixSignal b = new UnixSignal(Signum.SIGINT);

            Stdlib.raise(Signum.SIGINT);

            Assert.AreEqual(a.Count, 1);
            Assert.AreEqual(b.Count, 1);

            b.Close();
            a.Reset();

            Stdlib.raise(Signum.SIGINT);
            Assert.AreEqual(a.Count, 1);

            a.Close();
        }
Exemple #4
0
    // The main service loop
    private void MainLoop(ServiceBase [] services)
    {
        try {
            ServiceBase service;

            if (services == null || services.Length == 0)
            {
                error(logname, "No services were registered by this service");
                return;
            }

            // Start up the service.
            service = null;

            if (name != null)
            {
                foreach (ServiceBase svc in services)
                {
                    if (svc.ServiceName == name)
                    {
                        service = svc;
                        break;
                    }
                }
            }
            else
            {
                service = services [0];
            }

            call(service, "OnStart", new string [0]);
            info(logname, "Service {0} started", service.ServiceName);

            UnixSignal intr = new UnixSignal(Signum.SIGINT);
            UnixSignal term = new UnixSignal(Signum.SIGTERM);
            UnixSignal usr1 = new UnixSignal(Signum.SIGUSR1);
            UnixSignal usr2 = new UnixSignal(Signum.SIGUSR2);

            UnixSignal[] sigs = new UnixSignal[] {
                intr,
                term,
                usr1,
                usr2
            };

            for (bool running = true; running;)
            {
                int idx = UnixSignal.WaitAny(sigs);
                if (idx < 0 || idx >= sigs.Length)
                {
                    continue;
                }
                if ((intr.IsSet || term.IsSet) && service.CanStop)
                {
                    intr.Reset();
                    term.Reset();
                    info(logname, "Stopping service {0}", service.ServiceName);
                    call(service, "OnStop", null);
                    running = false;
                }
                else if (usr1.IsSet && service.CanPauseAndContinue)
                {
                    usr1.Reset();
                    info(logname, "Pausing service {0}", service.ServiceName);
                    call(service, "OnPause", null);
                }
                else if (usr2.IsSet && service.CanPauseAndContinue)
                {
                    usr2.Reset();
                    info(logname, "Continuing service {0}", service.ServiceName);
                    call(service, "OnContinue", null);
                }
            }
        } finally {
            // Clean up
            foreach (ServiceBase svc in services)
            {
                svc.Dispose();
            }
        }
    }