static void runDaemon(Procedure& proc) { boost::asio::signal_set terminateSignals(proc.getIoService()); terminateSignals.add(SIGINT); terminateSignals.add(SIGTERM); terminateSignals.async_wait([&] (const boost::system::error_code& error, int signalNo) { if (error) { return; } const char* signalName = ::strsignal(signalNo); std::cerr << "Exiting on signal "; if (signalName == nullptr) { std::cerr << signalNo; } else { std::cerr << signalName; } std::cerr << std::endl; proc.getIoService().stop(); }); util::Scheduler sched(proc.getIoService()); util::scheduler::ScopedEventId runEvt(sched); auto scheduleRerun = [&] (time::nanoseconds delay) { runEvt = sched.scheduleEvent(delay, [&] { proc.runOnce(); }); }; proc.onComplete.connect([&] (bool isSuccess) { scheduleRerun(DAEMON_UNCONDITIONAL_INTERVAL); }); net::NetworkMonitor netmon(proc.getIoService()); netmon.onNetworkStateChanged.connect([&] { scheduleRerun(NETMON_DAMPEN_PERIOD); }); scheduleRerun(DAEMON_INITIAL_DELAY); proc.getIoService().run(); }