一、前言
沒有任何人敢保證自己寫的程序沒有任何BUG,尤其是在商業項目中,程序量越大,復雜度越高,出錯的概率越大,尤其是現場環境千差萬別,和當初本地電腦測試環境很可能不一樣,有很多特殊情況沒有考慮到,如果需要保證程序7*24小時運行,則需要想一些辦法能夠讓程序死了能夠活過來,在嵌入式linux上,大部分會采用看門狗的形式來處理,程序打開看門狗驅動后,定時喂狗,一旦超過規定的時間,則硬件軟復位等。這種方式相對來說比較可靠,如果需要在普通PC機上運行怎辦呢?本篇文章提供一個軟件實現守護進程的辦法,原理就是udp通信,單獨寫個守護進程程序,專門負責檢測主程序是否存在,不存在則啟動。主程序只需要啟動live類監聽端口,收到hello就回復ok就行。
為了使得兼容任意程序,特意提煉出來共性,增加了多種設置。
主要功能:
- 可設置檢測的程序名稱。
- 可設置udp通信端口。
- 可設置超時次數。
- 自動記錄已重啟次數。
- 自動記錄最后一次重啟時間。
- 是否需要重新刷新桌面。
- 可重置當前重啟次數和最后重啟時間。
- 自動隱藏的托盤運行或者后台運行。
- 提供界面設置程序名稱已經開啟和暫停服務。
二、代碼思路
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()));
}
三、效果圖
四、開源主頁
以上作品完整源碼下載都在開源主頁,會持續不斷更新作品數量和質量,歡迎各位關注。