Linux 程序卡死的特殊处理

一、前言

Linux环境。

我们在日常编写的程序中,可能会出现一些细节问题,导致程序卡死,即程序没法正常运行,界面卡住,也不会闪退...

当这种问题出现在客户现场,那就是大问题了。。。

当我们暂时还无法排查出问题时,可以使用一些特殊手段进行监控,当发现程序卡死的时候,就可以将程序杀死掉。然后再将程序启动起来。

二、程序内部操作

首先在我们的程序代码中,增加QTimer超时或者线程去执行,每两秒钟执行命令:touch appclear.txt ,去修改文件的最近修改时间

这样做的处理是,只要主程序还没有卡死,那么appclear.txt文件就会每两秒钟都会被修改,剩下我们只需要在外部启动一个脚本用于监测该文件的修改时间,如果大于某个时间段没有修改操作了,那么就说明程序卡死了,就需要立即杀死程序。

1.QT

cpp 复制代码
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++

cpp 复制代码
#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)

bash 复制代码
#!/bin/bash

DATE_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 5

log_info "start"

while true ;do
	timestamp=`date +%s`
	filepath=/home/Jtom/appclear.txt


	if [ -f $filepath ];
	then
		filetimestamp=`stat -c %Y $filepath`
		timecha=$[$timestamp - $filetimestamp]

		if [ $timecha -gt 10 ];then
			log_info '强制退出程序'
			killall -9 HelloWorld	# HelloWorld 你的程序名字
			rm -f $filepath
			sleep 10
		else
			sleep 2
		fi

	else
		log_info "文件不存在或者您输入的路径有误"
		sleep 5
	fi
done


log_info "end"

四、再重新启动程序

程序被杀死后肯定需要自动再起来,那么我们还需要另一个脚本进行监控,如果程序没有被运行,则立即起来。

可以查看我之前的另一篇文章。

Linxu 守护程序https://blog.csdn.net/cpp_learner/article/details/139475547?spm=1001.2014.3001.5502

五、总结

这样操作下来,就可以避免程序卡死的尴尬情况。

当然,这只是一种临时处理方式,肯定不能长期使用,最终还是得排查程序找出问题,为什么卡死,这才是程序员该做的事情!

相关推荐
逢生博客3 分钟前
Ubuntu 安装 gvm 管理 Go 语言开发环境
linux·ubuntu·golang·gvm
多吃蔬菜!!!1 小时前
vscode 搭建C/C++开发环境搭建(linux)
linux·c语言·c++
李李李li1 小时前
Ubuntu 22.04 安装tensorrt
linux·tensorrt
phoenix09813 小时前
Linux入门DAY29
linux·运维
入秋3 小时前
Linux服务器安装部署 Nginx、Redis、PostgreSQL、Docker
linux·前端
Mr. Cao code4 小时前
使用Tomcat Clustering和Redis Session Manager实现Session共享
java·linux·运维·redis·缓存·tomcat
zcz16071278214 小时前
Linux 网络命令大全
linux·运维·网络
the sun344 小时前
Reactor设计模式及其在epoll中的应用
linux·运维·服务器·c++
喜欢你,还有大家4 小时前
Linux笔记7——shell编程基础-1
linux·运维·笔记
运维成长记4 小时前
Top 100 Linux Interview Questions and Answers
linux·运维·服务器