【链接】https://github.com/qtproject/qt-solutions/tree/master/qtservice
QtService 是 Qt 框架的一个组件,用于在各种操作系统上创建系统服务(守护进程)。它提供了跨平台的方式来开发无需用户交互即可运行的后台服务。
文件概览
-
qtservice.h - QtService 的头文件,包含类声明和接口定义
-
qtservice.cpp - QtService 的实现文件
-
qtservice_p.h - 定义了一个基于服务框架的私有实现类(PIMPL 模式)
主要特性
-
跨平台服务实现(支持 Windows、Linux、macOS)
-
服务生命周期管理(启动、停止、暂停、恢复)
-
服务操作日志记录功能
-
安装/卸载辅助工具
-
配置管理
核心组件
1. 核心类层次结构
QtServiceBase (抽象基类) ├── QtService<ApplicationType> (模板类) │ └── 用户服务类 (如MyService) └── QtServiceController (服务管理)
2. QtServiceBase 关键方法
主要功能:
-
服务生命周期管理(启动、停止、暂停、恢复)
-
服务安装/卸载
-
日志记录
-
服务配置
关键方法:
// 服务生命周期控制
virtual void start() = 0; // 纯虚函数,必须由子类实现
virtual void stop() = 0;
virtual void pause();
virtual void resume();
// 事件处理
virtual void processCommand(int code);
// 日志记录
void logMessage(const QString &message,
MessageType type = Information);
// 服务配置
void setServiceDescription(const QString &description);
void setStartupType(StartupType type);
QtServiceBasePrivate
类
-
功能:服务基类的核心实现,管理服务的配置、生命周期和系统交互。
-
关键成员:
-
serviceDescription
:服务的描述信息。 -
startupType
:服务的启动类型(如自动启动、手动启动等,枚举值)。 -
serviceFlags
:服务的标志位(例如是否支持暂停、恢复等操作)。 -
args
:命令行参数列表(QStringList
)。 -
instance
:静态成员,指向当前服务的唯一实例(单例模式)。 -
controller
:服务控制器对象,用于管理服务状态。 -
sysd
:指向平台相关实现的指针(跨平台兼容性设计)。
-
-
关键方法:
-
startService()
:启动服务。 -
run()
:运行服务(区分“作为服务运行”或“普通应用程序运行”)。 -
install()
:安装服务到系统(支持指定账户和密码)。 -
sysInit()
/sysCleanup()
:系统级的初始化和清理(平台相关)。 -
filePath()
:获取服务可执行文件的路径。
-
3. QtServiceController 服务管理
用于管理系统服务,提供对服务的控制功能。
主要功能:
-
查询服务状态
-
启动/停止/暂停/恢复服务
-
安装/卸载服务
关键方法:
// 服务状态查询
bool isInstalled() const;
bool isRunning() const;
ServiceFlags serviceFlags() const;
// 服务操作
bool start(const QStringList &args);
bool stop();
bool pause();
bool resume();
// 安装卸载
static bool install(const QString &name,
const QString &path,
const QString &account = QString(),
const QString &password = QString());
bool uninstall();
QtServiceControllerPrivate
类
-
功能:服务控制器的内部实现,管理服务名称和公共类的指针。
-
成员:
-
serviceName
:服务的名称(字符串)。 -
q_ptr
:指向公共类QtServiceController
的指针(通过Q_DECLARE_PUBLIC
宏关联)。
-
-
用途:被
QtServiceController
调用,封装底层服务控制逻辑(如启动、停止服务等)。
4. QtService<ApplicationType> 模板类
模板类,继承自 QtServiceBase,允许指定应用程序类型(如 QCoreApplication 或 QApplication)
创建自定义服务
class MyService : public QtService<QCoreApplication> {
public:
MyService(int &argc, char **argv)
: QtService<QCoreApplication>(argc, argv, "MyService") {
setServiceDescription("A sample service");
setStartupType(QtServiceController::AutoStartup);
}
protected:
void start() override {
logMessage("Service started");
// 初始化代码
}
void stop() override {
logMessage("Service stopped");
// 清理代码
}
};
int main(int argc, char *argv[]) {
MyService service(argc, argv);
return service.exec();
}
高级功能实现
1. 自定义命令处理
class CustomCommandService : public QtService<QCoreApplication> {
protected:
void processCommand(int code) override {
switch(code) {
case SERVICE_COMMAND_RELOAD:
reloadConfig();
break;
case SERVICE_COMMAND_BACKUP:
performBackup();
break;
default:
QtService<QCoreApplication>::processCommand(code);
}
}
};
2. 多线程服务架构
class ThreadedService : public QtService<QCoreApplication> {
public:
ThreadedService(int argc, char **argv)
: QtService(argc, argv, "ThreadedService") {
m_worker.moveToThread(&m_thread);
connect(&m_thread, &QThread::finished,
&m_worker, &QObject::deleteLater);
}
protected:
void start() override {
m_thread.start();
emit startWork(); // 触发工作线程
}
void stop() override {
m_thread.quit();
m_thread.wait();
}
private:
QThread m_thread;
ServiceWorker m_worker;
};
平台特定特性
Windows 特有功能
// 服务恢复策略
void setServiceRecoveryActions(
RecoveryAction firstFailure,
unsigned long firstDelay,
RecoveryAction secondFailure,
unsigned long secondDelay,
RecoveryAction subsequentFailures,
unsigned long subsequentDelay);
// 服务触发器
void setServiceTriggers(const QList<ServiceTrigger> &triggers);
// 服务SID类型
void setServiceSidType(ServiceSidType type);
Linux systemd 集成
// 定义systemd单元类型
void setUnitType(SystemdUnitType type);
// 设置看门狗配置
void setWatchdogEnabled(bool enable);
void sendWatchdogAlive(); // 发送心跳信号
服务配置管理
1. 注册表配置 (Windows)
QSettings settings("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\MyService",
QSettings::NativeFormat);
settings.setValue("Parameters/Timeout", 5000);
2. 配置文件方案
; service.conf
[Network]
Port=8080
Timeout=30
[Database]
Host=localhost
User=service
安全模型
1. 权限控制
// Linux下设置用户/组
void setRunAsUser(const QString &user);
void setRunAsGroup(const QString &group);
// Windows服务账户
void setServiceAccount(const QString &account,
const QString &password = QString());
2. 安全通信
// 使用QLocalServer进行本地IPC
m_server = new QLocalServer(this);
m_server->setSocketOptions(QLocalServer::UserAccessOption);
m_server->listen("com.company.service");
调试与诊断
1. 多模式启动
int main(int argc, char *argv[]) {
if (argc > 1) {
QString arg = argv[1];
if (arg == "--debug") {
// 控制台调试模式
QCoreApplication app(argc, argv);
ServiceDebugger debugger;
return app.exec();
}
if (arg == "--test") {
// 单元测试模式
QTest::qExec(new ServiceTest, argc, argv);
return 0;
}
}
// 正常服务模式
MyService service(argc, argv);
return service.exec();
}
2. 日志系统集成
void initLoggingSystem() {
// Windows事件日志
#ifdef Q_OS_WIN
QtServiceBase::setLoggingEnabled(true, "Application");
#endif
// Linux syslog
#ifdef Q_OS_LINUX
openlog("myservice", LOG_PID|LOG_CONS, LOG_DAEMON);
#endif
// 文件日志
QFile *logFile = new QFile("/var/log/myservice.log");
if (logFile->open(QIODevice::Append)) {
qInstallMessageHandler(myMessageHandler);
}
}
总结
-
资源管理:
-
使用RAII管理资源
-
实现优雅退出机制
-
-
错误处理:
void criticalFailure(const QString &message) { logMessage(message, QtServiceBase::Error); QCoreApplication::processEvents(); QtServiceController::self()->stop(); }
-
性能优化:
-
避免服务主线程阻塞
-
使用事件驱动架构
-
合理设置定时器精度
-
-
部署方案:
# Linux部署脚本示例 sudo cp myservice /usr/sbin/ sudo cp myservice.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable myservice
QtService的强大之处在于既保持了Qt的跨平台特性,又提供了各平台原生服务功能的完整访问能力。