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

五、总结

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

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

相关推荐
kebidaixu7 小时前
BCU 平台 RS485 驱动适配:从 THVD1406 到 ISO3082
linux
charlee449 小时前
Unity项目适配华为鸿蒙系统的原生库加载问题排查与解决
华为·unity3d·鸿蒙·cmake·c/c++·relro
谢平康9 小时前
解决用 rm 报bash: /usr/bin/rm: Argument list too long错
linux·运维·运维开发
hj28625111 小时前
Linux 网络服务综合笔记(概念 + 命令 + 实操案例)2
linux·运维·网络
what_201811 小时前
Linux 磁盘 (查看、划分、inode)
linux·运维·服务器
27399202911 小时前
GDB调试(Linux)
linux
凡人叶枫12 小时前
Effective C++ 条款23:宁以 non-member、non-friend 替换 member 函数
linux·开发语言·c++·嵌入式开发
不会C语言的男孩12 小时前
Linux 系统编程 · 第 4 章:文件属性与元数据
linux·c语言·开发语言
小生不才yz12 小时前
Shell脚本精读 · S02-03 | 词拆分、通配符与未加引号的变量
linux
2601_9618454212 小时前
法考真题及答案解析|历年真题|资料已整理
linux·windows·ubuntu·macos·centos·gnu