编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • Android提升进阶

  • iOS开发和进阶

  • Web开发和进阶

  • Linux应用开发

    • README
    • QML基础入门

    • QT核心库实践

    • Linux实践开发

      • README
      • Linux开发指引
      • 崩溃监听实践
      • Linux应用指令
      • 应用重启策略
        • 01.如何启动应用
          • 1.1 终端命令行启动
          • 1.2 提供的启动器
          • 1.3 系统服务启动
          • 1.4 脚本控制启动
          • 1.5 系统启动时自动启动
        • 02.应用重启策略
          • 2.1 外部脚本或程序重启
          • 2.2 QProcess重启自身
          • 2.3 守护进程管理
          • 2.4 重新加载QML
          • 2.5 外部程序捕获并重启
          • 2.6 状态机重启应用
          • 2.7 方案选择分析
      • 守护进程保活
      • 脚本进程保活
      • 应用启动的原理
      • LVGL设计原理
      • Qt应用保活方案设计
  • Apps
  • Linux应用开发
  • Linux实践开发
杨充
2025-09-13
目录

应用重启策略

# 03.应用重启策略

# 目录介绍

  • 01.如何启动应用
    • 1.1 终端命令行启动
    • 1.2 提供的启动器
    • 1.3 系统服务启动
    • 1.4 脚本控制启动
    • 1.5 系统启动时自动启动
  • 02.应用重启策略
    • 2.1 外部脚本或程序重启
    • 2.2 QProcess重启自身
    • 2.3 守护进程管理
    • 2.4 重新加载QML
    • 2.5 外部程序捕获并重启
    • 2.6 状态机重启应用
    • 2.7 方案选择分析

# 01.如何启动应用

# 1.1 终端命令行启动

设计思想:最简单直接的启动方式,适用于开发和调试阶段。用户或开发者直接打开终端,输入可执行文件的路径来启动应用。

命令示例:./yt-palm 或 path/to/yt-palm,这个案例中yt-palm是表示应用。

适合开发和调试,便于查看控制台输出和错误信息。

# 1.2 提供的启动器

设计思想:为了方便用户从图形界面启动应用,遵循桌面环境的规范。创建一个.desktop文件,指定应用的名称、图标、可执行文件路径等信息,用户可以通过点击图标来启动应用。

文件位置:通常放在/usr/share/applications/或用户本地目录~/.local/share/applications/

# 1.3 系统服务启动

设计思想:将Qt应用作为后台服务或守护进程运行,适用于无界面或需要长时间运行的应用。通过systemd服务管理,可以设置依赖关系、自动重启、日志管理等。

服务文件:创建一个.service文件,定义服务的执行命令、工作目录、用户等。

# 1.4 脚本控制启动

设计思想:通过编写shell脚本,可以在启动应用前设置环境变量、检查依赖、准备资源等。脚本还可以处理应用崩溃后的重启,或者根据条件决定是否启动。

示例:一个循环脚本,在应用异常退出时重新启动它。

#!/bin/bash
# 设置环境变量
export QT_QPA_PLATFORM=xcb
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH

# 执行应用
cd /path/to/app
exec ./myqtapp "$@"
1
2
3
4
5
6
7
8

# 1.5 系统启动时自动启动

设计思想:将应用设置为系统启动时自动运行,适用于需要随系统启动而启动的应用(如系统工具、后台服务)。可以通过将启动命令添加到rc.local或使用systemd的enable功能实现。

# 02.应用重启策略

# 2.1 外部脚本或程序重启

设计思想:通过退出当前应用并调用一个外部脚本或另一个程序来重新启动应用。这个外部脚本可以是Shell脚本(Linux/macOS),它等待应用完全退出后再重新启动应用。

实现方式:在C++中,可以使用QProcess来启动一个外部脚本,然后退出应用程序。外部脚本会监控原应用的退出,然后重新启动它。

# 2.2 QProcess重启自身

设计思想:利用QProcess启动一个新的应用实例,然后退出当前实例。这种方法不需要外部脚本,但需要确保新实例的启动路径正确。

实现方式:在应用退出之前,使用QProcess启动相同的可执行文件(可能需要获取当前可执行文件的路径),然后退出当前应用。

# 2.3 守护进程管理

设计思想:将应用设计为由系统服务或守护进程管理。当应用退出时,由守护进程负责重新启动。这种方法更适用于服务型应用,但也可以用于桌面应用。

实现方式:在Linux上可以使用systemd,Windows上可以使用服务管理器。应用退出时,守护进程会根据配置重启应用。

# 2.4 重新加载QML

设计思想:不真正重启整个应用,而是通过清除QML引擎的缓存并重新加载QML界面来模拟重启。这种方法只重置QML部分,不重启C++后端。

实现方式:在C++中获取QQmlEngine实例,调用clearComponentCache(),然后重新加载主QML文件。但这种方法不会重置C++状态,所以需要确保C++端也能重置状态。

# 2.5 外部程序捕获并重启

设计思想:应用程序退出时返回一个特定的退出码,外部脚本或程序根据这个退出码决定重启应用。

实现方式:在主函数中,根据退出原因返回不同的退出码。外部脚本检查退出码,如果是重启的退出码,则重新启动应用。

# 2.6 状态机重启应用

设计思想:将应用设计为一个状态机,当需要重启时,不退出整个应用,而是重置所有状态并重新初始化。这种方法避免了整个进程的关闭和启动,可能更快速。

实现方式:在C++端,设计一个全局的状态管理器,当收到重启信号时,释放并重新初始化所有模块,然后重新加载QML界面。

# 2.7 方案选择分析

如果希望完全重启(包括C++后端),则选择方案1、2、3或5。

如果只是希望重置QML界面而保留C++后端状态,则方案4可能足够。

如果希望快速重启并且能够控制所有模块的初始化,方案6可能更合适。

上次更新: 2026/06/10, 11:13:41
Linux应用指令
守护进程保活

← Linux应用指令 守护进程保活→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式