1#ifndef NEFORCE_CORE_SYSTEM_DAEMON_HPP__
2#define NEFORCE_CORE_SYSTEM_DAEMON_HPP__
18NEFORCE_BEGIN_NAMESPACE__
29struct daemon_exception final : system_exception {
30 explicit daemon_exception(
const char* info =
"Daemon Operation Failed.",
32 system_exception(info, code) {}
34 explicit daemon_exception(
const exception& e) :
35 system_exception(e) {}
37 ~daemon_exception()
override =
default;
39 NEFORCE_NODISCARD
const char*
type() const noexcept
override {
return "daemon_exception"; }
71class NEFORCE_API daemon {
120#ifdef NEFORCE_PLATFORM_WINDOWS
121 void* pid_handle_{
nullptr};
126 string work_dir_{
"/"};
128 unique_ptr<signal_guard> signal_guard_;
130 system_event shutdown_event_{
false, system_event::type::manual_reset};
131 system_event reload_event_{
false, system_event::type::auto_reset};
135 unique_ptr<process> proc;
136 int restart_count{0};
138 int64_t last_health_check_ms{0};
141 mutable mutex children_mutex_;
142 unordered_map<string, child_entry> children_;
144 start_callback on_start_;
145 stop_callback on_stop_;
146 reload_callback on_reload_;
147 child_exit_callback on_child_exit_;
149 atomic<bool> watchdog_enabled_{
false};
150 atomic<int> watchdog_timeout_ms_{0};
151 atomic<int64_t> last_ping_{0};
152 thread watchdog_thread_;
154 bool daemonize_impl() noexcept;
155 void setup_signal_handlers();
156 void start_all_children();
157 void stop_all_children();
158 void check_and_restart_children();
159 static
void start_child(child_entry& entry);
160 void watchdog_loop();
166 daemon(const daemon&) = delete;
167 daemon& operator=(const daemon&) = delete;
168 daemon(daemon&&) = delete;
169 daemon& operator=(daemon&&) = delete;
252#ifdef NEFORCE_PLATFORM_LINUX
273NEFORCE_END_NAMESPACE__
void request_shutdown()
请求优雅关闭(可从任何线程调用)
function< void(const string &name, int exit_code)> child_exit_callback
子进程退出回调
static bool is_pid_file_locked(const string &path) noexcept
检查 PID 文件是否被锁定
void on_child_exit(child_exit_callback cb)
注册子进程退出回调
bool daemonize(const string &work_dir="/")
将当前进程转为守护进程(Linux 双 fork)
bool write_pid_file(const string &path)
创建并锁定 PID 文件(单实例保护)
static void notify_ready()
通知 systemd 服务已就绪
void remove_pid_file() noexcept
删除 PID 文件并释放锁
static void notify_watchdog()
通知 systemd 看门狗喂狗
void watchdog_ping()
看门狗喂狗(从工作线程周期性调用)
daemon_state state() const noexcept
获取当前状态
void remove_child(const string &name)
移除子进程(先优雅终止)
function< bool()> reload_callback
重载回调,收到 SIGHUP 后调用。返回 true 继续运行,false 请求终止
void on_reload(reload_callback cb)
注册重载回调
vector< child_status > all_child_statuses() const
获取所有子进程状态
bool add_child(const child_config &cfg)
添加受管理的子进程
void on_stop(stop_callback cb)
注册停止回调
void on_start(start_callback cb)
注册启动回调
function< void()> stop_callback
停止回调,收到终止信号后调用
child_status get_child_status(const string &name) const
获取子进程运行状态
static void notify_status(const string &status)
通知 systemd 服务状态
void request_reload()
请求重载配置(可从任何线程调用)
function< void()> start_callback
启动回调,run() 进入主循环前调用
void set_watchdog_timeout(int timeout_ms)
设置看门狗超时
unsigned long native_id_type
进程ID类型
error_code last_error() noexcept
获取当前系统错误码
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
int restart_delay_ms
重启前等待时间
string work_dir
工作目录(空=继承)
vector< string > args
命令行参数
int graceful_timeout_ms
停止时的优雅超时
vector< pair< string, string > > envs
额外环境变量
bool capture_output
是否捕获子进程输出
int health_check_interval_ms
健康检查间隔
process::native_id_type pid
进程 ID
const char * type() const noexcept override
获取异常类型