在Linux系统中,systemd已经成为大多数发行版默认的初始化系统和服务管理器。使用C++开发后台守护进程时,不再需要自己编写复杂的fork逻辑,只需写好普通的可执行程序,再通过systemd的service单元文件托管即可。这种方式能自动处理进程退出重启、日志收集以及开机自启等问题。

一、编写C++后台服务程序
下面这段C++代码是一个最简单的后台服务示例,它会每隔两秒向日志输出一句话,模拟长期运行的服务任务。注意这里不需要调用daemon函数,因为systemd会帮我们脱离终端。
#include <iostream>
#include <chrono>
#include <thread>
int main() {
// 模拟后台服务:每2秒打印一次心跳
while (true) {
std::cout << "C++ service is running..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
}
return 0;
}
使用g++编译生成可执行文件,例如放到/usr/local/bin/my_cpp_service。
g++ -o /usr/local/bin/my_cpp_service main.cpp
二、编写systemd服务单元文件
在/etc/systemd/system/目录下新建一个后缀为service的文件,比如my_cpp_service.service,内容如下。
[Unit] Description=My C++ Background Service After=network.target [Service] ExecStart=/usr/local/bin/my_cpp_service Restart=always User=root StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
其中Restart=always表示进程意外退出时systemd会自动拉起;StandardOutput=journal代表日志进入systemd日志系统。
常用配置项说明
- ExecStart:服务启动命令的绝对路径
- Restart:可选no、on-failure、always等
- User:以哪个系统用户身份运行
- WantedBy:定义开机启动所依赖的目标
三、加载并管理服务
写好文件后,需要让systemd重新读取配置,然后启动服务并设置开机自启。
systemctl daemon-reload systemctl start my_cpp_service systemctl enable my_cpp_service
查看运行状态与日志可以使用以下命令:
systemctl status my_cpp_service journalctl -u my_cpp_service -f
四、停止与卸载
如果不再需要该服务,先停止再关闭自启,最后删除service文件即可。
systemctl stop my_cpp_service systemctl disable my_cpp_service rm /etc/systemd/system/my_cpp_service.service systemctl daemon-reload
提示:在代码中若需接收systemd的退出信号,可以监听SIGTERM信号来做优雅关闭。
五、小结
通过上面的步骤,我们用C++写了一个普通循环程序,并借助systemd变成了标准的Linux守护进程。相比传统自写daemon,这种方法更简单、稳定,也更容易运维。实际项目中可以把业务逻辑替换成网络服务或数据采集任务,再配合systemd的定时重启策略,就能轻松跑在生产环境。