NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
daemon.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_SYSTEM_DAEMON_HPP__
2#define NEFORCE_CORE_SYSTEM_DAEMON_HPP__
3
8
18NEFORCE_BEGIN_NAMESPACE__
19
24
29struct daemon_exception final : system_exception {
30 explicit daemon_exception(const char* info = "Daemon Operation Failed.",
31 const error_code code = last_error()) noexcept :
32 system_exception(info, code) {}
33
34 explicit daemon_exception(const exception& e) :
35 system_exception(e) {}
36
37 ~daemon_exception() override = default;
38
39 NEFORCE_NODISCARD const char* type() const noexcept override { return "daemon_exception"; }
40};
41 // Exceptions
43
49
71class NEFORCE_API daemon {
72public:
74 enum class daemon_state {
75 stopped,
76 starting,
77 running,
78 reloading,
79 stopping
80 };
81
95
97 struct child_status {
98 string name;
100 int exit_code{0};
102 bool running{false};
103 };
104
106 using start_callback = function<void()>;
107
109 using stop_callback = function<void()>;
110
112 using reload_callback = function<bool()>;
113
115 using child_exit_callback = function<void(const string& name, int exit_code)>;
116
117private:
119
120#ifdef NEFORCE_PLATFORM_WINDOWS
121 void* pid_handle_{nullptr};
122#else
123 int pid_fd_{-1};
124#endif
125 string pid_path_;
126 string work_dir_{"/"};
127
128 unique_ptr<signal_guard> signal_guard_;
129
130 system_event shutdown_event_{false, system_event::type::manual_reset};
131 system_event reload_event_{false, system_event::type::auto_reset};
132
133 struct child_entry {
134 child_config config;
135 unique_ptr<process> proc;
136 int restart_count{0};
137 int exit_code{0};
138 int64_t last_health_check_ms{0};
139 bool running{false};
140 };
141 mutable mutex children_mutex_;
142 unordered_map<string, child_entry> children_;
143
144 start_callback on_start_;
145 stop_callback on_stop_;
146 reload_callback on_reload_;
147 child_exit_callback on_child_exit_;
148
149 atomic<bool> watchdog_enabled_{false};
150 atomic<int> watchdog_timeout_ms_{0};
151 atomic<int64_t> last_ping_{0};
152 thread watchdog_thread_;
153
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();
161
162public:
163 daemon() = default;
164 ~daemon();
165
166 daemon(const daemon&) = delete;
167 daemon& operator=(const daemon&) = delete;
168 daemon(daemon&&) = delete;
169 daemon& operator=(daemon&&) = delete;
170
172 void on_start(start_callback cb) { on_start_ = move(cb); }
173
175 void on_stop(stop_callback cb) { on_stop_ = move(cb); }
176
178 void on_reload(reload_callback cb) { on_reload_ = move(cb); }
179
181 void on_child_exit(child_exit_callback cb) { on_child_exit_ = move(cb); }
182
189 bool daemonize(const string& work_dir = "/");
190
197 bool write_pid_file(const string& path);
198
200 void remove_pid_file() noexcept;
201
203 NEFORCE_NODISCARD static bool is_pid_file_locked(const string& path) noexcept;
204
210 bool add_child(const child_config& cfg);
211
216 void remove_child(const string& name);
217
219 NEFORCE_NODISCARD child_status get_child_status(const string& name) const;
220
222 NEFORCE_NODISCARD vector<child_status> all_child_statuses() const;
223
228 int run();
229
232
235
237 NEFORCE_NODISCARD daemon_state state() const noexcept { return state_.load(); }
238
245
250 void set_watchdog_timeout(int timeout_ms);
251
252#ifdef NEFORCE_PLATFORM_LINUX
256 static void notify_ready();
257
262 static void notify_status(const string& status);
263
267 static void notify_watchdog();
268#endif
269};
270 // Daemon
272
273NEFORCE_END_NAMESPACE__
274#endif // NEFORCE_CORE_SYSTEM_DAEMON_HPP__
原子类型完整实现
void request_shutdown()
请求优雅关闭(可从任何线程调用)
function< void(const string &name, int exit_code)> child_exit_callback
子进程退出回调
daemon_state
守护进程运行状态
int run()
进入信号驱动主循环(阻塞)
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类型
动态大小数组容器
通用函数包装器
long int64_t
64位有符号整数类型
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
停止时的优雅超时
int max_restarts
最大自动重启次数
vector< pair< string, string > > envs
额外环境变量
bool capture_output
是否捕获子进程输出
int health_check_interval_ms
健康检查间隔
string executable
可执行文件路径
子进程运行时状态
process::native_id_type pid
进程 ID
int restart_count
已重启次数
bool running
是否正在运行
const char * type() const noexcept override
获取异常类型
系统事件同步原语
线程管理类
独占智能指针
无序映射容器