zoukankan      html  css  js  c++  java
  • Qt开源作品36-程序守护进程

    一、前言

    没有任何人敢保证自己写的程序没有任何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/
  • 相关阅读:
    面向对象的链式调用
    浅显易懂的理解JavaScript中的this关键字
    js 页面刷新location.reload和location.replace的区别小结
    JavaScript中两种类型的全局对象/函数
    event.srcElement ,event.fromElement,event.toElement
    json jsonp的区别
    createElement与createDocumentFragment的点点区别
    解决Ajax不能跨域的方法
    mysqli_fetch_assoc php的新的库函数
    500 501 502 503 504 505 服务器错误
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/13168342.html
Copyright © 2011-2022 走看看