2024年最值得收藏的科研工具:Google-Mirrors学术镜像站使用全攻略
2026/9/12 11:59:01
在Ubuntu下使用Qt和C++实现应用程序崩溃后自动重启,可通过以下6种核心方法实现,每种方法均包含技术细节和适用场景:
QProcess::startDetached()启动新进程,通过QTimer::singleShot()延迟退出当前进程。cpp
void restartApplication() { QString path = QApplication::applicationFilePath(); QStringList args = QApplication::arguments(); QProcess::startDetached(path, args); QTimer::singleShot(500, qApp, &QCoreApplication::quit); }QSettings或数据库保存用户会话。sudo权限,但需谨慎配置。/etc/systemd/system/myapp.service):ini
[Service] Type=simple ExecStart=/path/to/app Restart=on-failure RestartSec=5s StartLimitInterval=60s StartLimitBurst=5sudo systemctl daemon-reload和sudo systemctl restart myapp生效。WatchdogSec=30s,服务需定期发送心跳信号。journalctl -u myapp分析崩溃原因。SIGSEGV段错误、SIGABRT异常终止),在信号处理器中启动新进程。cpp
QApplication *appPtr = nullptr; void signalHandler(int signum) { QProcess::startDetached(appPtr->applicationFilePath(), appPtr->arguments()); std::exit(signum); } int main(int argc, char *argv[]) { QApplication app(argc, argv); appPtr = &app; signal(SIGSEGV, signalHandler); return app.exec(); }QApplication实例。ini
[program:myapp] command=python /path/to/app autostart=true autorestart=true stderr_logfile=/var/log/myapp.err.logpgrep查找进程ID,kill -9终止后重启:cpp
void restartApp(const QString &name) { QProcess::execute("pkill", {"-f", name}); // 终止所有匹配进程 QProcess::startDetached(name); // 启动新实例 }Qt::QueuedConnection确保槽函数在目标线程事件循环执行。QMutex或QReadWriteLock保护共享资源。cpp
connect(sender, &Sender::signal, receiver, &Receiver::slot, Qt::QueuedConnection);pgrep/kill)终止旧进程并启动新实例:cpp
void restartApp(const QString &name) { QProcess pidProcess; pidProcess.start("pgrep", {name}); pidProcess.waitForFinished(); QStringList pids = QString::fromUtf8(pidProcess.readAllStandardOutput()).split("\n"); for (const QString &pid : pids) { QProcess::execute("kill", {"-9", pid.toUtf8()}); } QProcess::startDetached(name); }sudo),且依赖系统工具(pgrep/kill默认安装)。通过上述方法,可实现从应用层到系统层的崩溃自动重启,保障服务连续性。实际选择时需根据应用场景、权限要求、资源限制等因素综合评估。