写好代码只是第一步,如何让服务在 Linux 服务器上稳定运行、易于管理,是运维的关键。
1. Daemon 化 (守护进程)
1.1. 传统方式 (Double Fork)
在 systemd 普及之前,我们需要手动编写代码让程序后台运行:
1. fork() 并退出父进程。 2.
setsid() 创建新会话。 3. 再次
fork() 防止重新获取控制终端。 4. 重定向
stdin/stdout/stderr 到 /dev/null。
1.2. Systemd 集成 (推荐)
现在推荐直接在前台运行,由 systemd 管理后台化和日志。
myapp.service:
[Unit]
Description=My Libevent Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myserver --port 8080
Restart=always
User=nobody
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target2. 优雅退出 (Graceful Shutdown)
直接 kill -9
会导致数据丢失、文件损坏。我们需要捕获信号,有序退出。
2.1. 信号处理
如前文所述,使用 evsignal_new 监听
SIGINT (Ctrl+C) 和 SIGTERM
(kill)。
2.2. 退出策略
event_base_loopexit(base, &tv): 推荐。它会等待当前正在执行的回调函数完成,并在指定时间tv后退出循环。event_base_loopbreak(base): 立即退出。如果当前正在处理激活队列,剩下的事件将被丢弃。
2.3. 资源清理
退出循环后,event_base_dispatch
返回。此时应释放资源: 1. evconnlistener_free
(停止监听)。 2. bufferevent_free
(关闭现有连接)。 3. event_base_free。
3. 总结
拥抱 Systemd,实现优雅退出,是生产级服务的标配。
上一篇: 06-production/ecosystem.md - 生态集成 下一篇: 06-production/observability.md - 可观测性