当前位置: 首页 > news >正文

Linux 程序卡死的特殊处理

一、前言

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 守护程序icon-default.png?t=N7T8https://blog.csdn.net/cpp_learner/article/details/139475547?spm=1001.2014.3001.5502

五、总结

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 进度条提示-在python程序中使用避免我误以为挂掉了
  • 微服务的分布式事务解决方案
  • Linux 初识
  • 通过Arcgis从逐月平均气温数据中提取并计算年平均气温
  • springboot 操作mongo
  • 云计算渲染时代:选择Blender或KeyShot进行高效渲染
  • 第一关:Linux基础知识
  • easy-poi实现动态列(标题)、多sheet导出excel
  • 爬虫:Sentry-Span参数逆向
  • mysql数据库被偷家,数据全部丢失。还勒索我给他比特币
  • vue extend的作用和使用方法
  • vue3 + tsx 表格 Action 单独封装组件用法
  • three完全开源扩展案例02-跳动的音乐
  • Blender新手入门笔记收容所(一)
  • Apache Seata应用侧启动过程剖析——RM TM如何与TC建立连接
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • iOS编译提示和导航提示
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Redis 中的布隆过滤器
  • SOFAMosn配置模型
  • spring security oauth2 password授权模式
  • 程序员该如何有效的找工作?
  • 创建一种深思熟虑的文化
  • 使用Swoole加速Laravel(正式环境中)
  • 网络应用优化——时延与带宽
  • 用Canvas画一棵二叉树
  • 用jquery写贪吃蛇
  • MPAndroidChart 教程:Y轴 YAxis
  • PostgreSQL之连接数修改
  • # 数据结构
  • #define与typedef区别
  • #pragma 指令
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (4)STL算法之比较
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Git) gitignore基础使用
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (区间dp) (经典例题) 石子合并
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (转)linux 命令大全
  • (转载)深入super,看Python如何解决钻石继承难题
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net Redis的秒杀Dome和异步执行
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @DataRedisTest测试redis从未如此丝滑
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @Resource和@Autowired的区别
  • []我的函数库