美文网首页Qt
Qt开源作品36-程序守护进程

Qt开源作品36-程序守护进程

作者: feiyangqingyun | 来源:发表于2020-06-20 13:01 被阅读0次

一、前言

没有任何人敢保证自己写的程序没有任何BUG,尤其是在商业项目中,程序量越大,复杂度越高,出错的概率越大,尤其是现场环境千差万别,和当初本地电脑测试环境很可能不一样,有很多特殊情况没有考虑到,如果需要保证程序7*24小时运行,则需要想一些办法能够让程序死了能够活过来,在嵌入式linux上,大部分会采用看门狗的形式来处理,程序打开看门狗驱动后,定时喂狗,一旦超过规定的时间,则硬件软复位等。这种方式相对来说比较可靠,如果需要在普通PC机上运行怎办呢?本篇文章提供一个软件实现守护进程的办法,原理就是udp通信,单独写个守护进程程序,专门负责检测主程序是否存在,不存在则启动。主程序只需要启动live类监听端口,收到hello就回复ok就行。
为了使得兼容任意程序,特意提炼出来共性,增加了多种设置。

主要功能:

  1. 可设置检测的程序名称。
  2. 可设置udp通信端口。
  3. 可设置超时次数。
  4. 自动记录已重启次数。
  5. 自动记录最后一次重启时间。
  6. 是否需要重新刷新桌面。
  7. 可重置当前重启次数和最后重启时间。
  8. 自动隐藏的托盘运行或者后台运行。
  9. 提供界面设置程序名称已经开启和暂停服务。

二、代码思路

AppLive::AppLive(QObject *parent) : QObject(parent)
{
    udpServer  = new QUdpSocket(this);

    QString name = qApp->applicationFilePath();
    QStringList list = name.split("/");
    appName = list.at(list.count() - 1).split(".").at(0);
}

void AppLive::readData()
{
    QByteArray tempData;

    do {
        tempData.resize(udpServer->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;
        udpServer->readDatagram(tempData.data(), tempData.size(), &sender, &senderPort);
        QString data = QLatin1String(tempData);

        if (data == "hello") {
            udpServer->writeDatagram(QString("%1OK").arg(appName).toLatin1(), sender, senderPort);
        }
    } while (udpServer->hasPendingDatagrams());
}

bool AppLive::start(int port)
{
    bool ok = udpServer->bind(port);
    if (ok) {
        connect(udpServer, SIGNAL(readyRead()), this, SLOT(readData()));
        qDebug() << TIMEMS << "Start AppLive Ok";
    }

    return ok;
}

void AppLive::stop()
{
    udpServer->abort();
    disconnect(udpServer, SIGNAL(readyRead()), this, SLOT(readData()));
}

三、效果图

在这里插入图片描述

四、开源主页

以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

相关文章

  • Qt开源作品36-程序守护进程

    一、前言 没有任何人敢保证自己写的程序没有任何BUG,尤其是在商业项目中,程序量越大,复杂度越高,出错的概率越大,...

  • 进程守护程序的一点想法

    笔者前段时间看到有个用 QT写的进程守护程序,在程序有卡死等问题时就依靠单独的守护程序来做健康检查,重启进程。...

  • linux进程

    linux进程包含如下几个方面:1:进程的控制(创建,等待子进程终止,执行程序,退出)2:守护进程(什么是守护进程...

  • 进程守护和非守护概念

    进程分为两种: 1、守护进程2、非守护进程 一个软件程序启动之后,可以根据需要创建很多个进程。比如创建了5个进程,...

  • 编译异常

    无法启动守护进程 无法启动守护进程可能是后台配置有问题,也可能是电脑运行程序太多...

  • 0102

    数据库有两个关键程序: 服务器mysqld(d代表daemon,即守护进程)。MySQL和MariaDB的守护进程...

  • Laravel —— 队列配置 Supervisor

    安装Supervisor Supervisor 是 Linux 系统中常用的进程守护程序。如果队列进程 queue...

  • 如何在Docker守护进程停机期间保持容器处于活动状态

    默认情况下,当 Docker 守护进程终止时,它会关闭正在运行的容器。您可以配置守护程序,以便在守护程序不可用时容...

  • rsync服务企业应用

    守护进程服务企业应用: 守护进程多模块功能配置 守护进程的排除功能实践 守护进程来创建备份目录 守护进程的访问控制...

  • 139-Ubuntu16.04服务器下Supervisor实现p

    Supervisor是Linux系统中常用的进程守护程序,如果队列进程意外关闭,它会自动重启启动队列进程 。 [S...

网友评论

    本文标题:Qt开源作品36-程序守护进程

    本文链接:https://www.haomeiwen.com/subject/fjiwxktx.html