在 Linux 上写 C++ 服务(后台服务 / daemon),一般可以分为几个阶段:开发 → 编译 → 运行方式(前台/后台/系统服务)→ 管理(日志、自启、守护)。下面给你一个从零到可上线的清晰路线。
// server.cpp
#include <iostream>
#include <unistd.h>
int main() {
while (true) {
std::cout << "service running..." << std::endl;
sleep(5);
}
return 0;
}
g++ server.cpp -o server
./server
./server &
或者
nohup ./server > server.log 2>&1 &
sudo vim /etc/systemd/system/myserver.service
内容示例:
[Unit]
Description=My C++ Service
After=network.target
[Service]
ExecStart=/home/user/server
WorkingDirectory=/home/user
Restart=always
User=user
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start myserver
sudo systemctl enable myserver
systemctl status myserver
journalctl -u myserver -f
✅ 这是生产环境最推荐方式
自己 fork + setsid,不适合新手,现代系统不建议。
#include <signal.h>
volatile bool running = true;
void handler(int) {
running = false;
}
int main() {
signal(SIGTERM, handler);
signal(SIGINT, handler);
while (running) {
// do work
}
}
#include <fstream>
std::ofstream log("server.log", std::ios::app);
log << "running" << std::endl;
或用 spdlog(强烈推荐)
// 用 socket / epoll / boost.asio
常用库:
Boost.Asiolibeventmuduo(高性能 C++)myserver/
├── CMakeLists.txt
├── src/
│ └── main.cpp
├── build/
└── config.yaml
cmake_minimum_required(VERSION 3.10)
project(myserver)
add_executable(myserver src/main.cpp)
gdb ./server
strace -f ./server
top / htop
systemctl restart myserver
✅ 推荐路线
systemd 管理服务journalctlCMake 管理项目如果你愿意,我可以:
你现在是 学习 / 面试 / 生产项目 哪一种?