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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM