一、前言
Linux環境。
我們在日常編寫的程序中,可能會出現一些細節問題,導致程序卡死,即程序沒法正常運行,界面卡住,也不會閃退...
當這種問題出現在客戶現場,那就是大問題了。。。
當我們暫時還無法排查出問題時,可以使用一些特殊手段進行監控,當發現程序卡死的時候,就可以將程序殺死掉。然后再將程序啟動起來。
二、程序內部操作
首先在我們的程序代碼中,增加QTimer超時或者線程去執行,每兩秒鐘執行命令:touch appclear.txt? ,去修改文件的最近修改時間
這樣做的處理是,只要主程序還沒有卡死,那么appclear.txt文件就會每兩秒鐘都會被修改,剩下我們只需要在外部啟動一個腳本用于監測該文件的修改時間,如果大于某個時間段沒有修改操作了,那么就說明程序卡死了,就需要立即殺死程序。
1.QT
QTimer m_touch_timer;// 每2s改一下文件的修改該時間,使得腳本可以監控程序有沒有死掉
connect(&m_touch_timer, &QTimer::timeout, [this]() {QProcess::startDetached("touch", QStringList() << "appclear.txt");
});
m_touch_timer.setInterval(2000);
m_touch_timer.start();
2.C/C++
#include <iostream>
#include <thread>
#include <chrono>
#include <cstdlib> // 對于system函數 // 定義一個函數,該函數將作為線程的執行體
void periodicTouch() { while (true) { // 執行touch命令 system("touch appclear.txt"); // 等待兩秒鐘 std::this_thread::sleep_for(std::chrono::seconds(2)); }
} int main() { // 創建一個線程來運行periodicTouch函數 std::thread touchThread(periodicTouch); touchThread.join(); return 0;
}
三、外部監控腳本
此腳本會每兩秒鐘監控一次appclear.txt文件的最近修改時間,如果當前時間與文件的最近修改時間做差值 大于 10,那么就說明程序已經卡死10秒鐘了,可以殺死程序。(假設程序名為HelloWorld)
#!/bin/bashDATE_N_=`date "+%Y-%m-%d"`
LOG_PATH_NAME="/home/Jtom/log/${DATE_N_}_appclear_sh.log"log_info()
{DATE_N=`date "+%Y-%m-%d %H:%M:%S"`echo "${DATE_N} $0 [INFO] $@" >> ${LOG_PATH_NAME}
}sleep 5log_info "start"while true ;dotimestamp=`date +%s`filepath=/home/Jtom/appclear.txtif [ -f $filepath ];thenfiletimestamp=`stat -c %Y $filepath`timecha=$[$timestamp - $filetimestamp]if [ $timecha -gt 10 ];thenlog_info '強制退出程序'killall -9 HelloWorld # HelloWorld 你的程序名字rm -f $filepathsleep 10elsesleep 2fielselog_info "文件不存在或者您輸入的路徑有誤"sleep 5fi
donelog_info "end"
四、再重新啟動程序
程序被殺死后肯定需要自動再起來,那么我們還需要另一個腳本進行監控,如果程序沒有被運行,則立即起來。
可以查看我之前的另一篇文章。
Linxu 守護程序https://blog.csdn.net/cpp_learner/article/details/139475547?spm=1001.2014.3001.5502
五、總結
這樣操作下來,就可以避免程序卡死的尷尬情況。
當然,這只是一種臨時處理方式,肯定不能長期使用,最終還是得排查程序找出問題,為什么卡死,這才是程序員該做的事情!