宁波网站建设详细方案模板,百度一下免费下载,做好的网站怎么演示,南开天津网站建设一、前言
Linux环境。
我们在日常编写的程序中#xff0c;可能会出现一些细节问题#xff0c;导致程序卡死#xff0c;即程序没法正常运行#xff0c;界面卡住#xff0c;也不会闪退...
当这种问题出现在客户现场#xff0c;那就是大问题了。。。
当我们暂时还无法排…
一、前言
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.loglog_info()
{DATE_Ndate %Y-%m-%d %H:%M:%Secho ${DATE_N} $0 [INFO] $ ${LOG_PATH_NAME}
}sleep 5log_info startwhile true ;dotimestampdate %sfilepath/home/Jtom/appclear.txtif [ -f $filepath ];thenfiletimestampstat -c %Y $filepathtimecha$[$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?spm1001.2014.3001.5502
五、总结
这样操作下来就可以避免程序卡死的尴尬情况。
当然这只是一种临时处理方式肯定不能长期使用最终还是得排查程序找出问题为什么卡死这才是程序员该做的事情