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

Linux 编程“插装”工具

工欲善其事,必先利其器。 --- 工匠要高效完成劳作,必须先打磨锋利自己的工具。

背景: 在软件开发过程中,代码运行稳定性不能仅依赖交付测试时的问题暴露后进行修复,更重要的是在代码搭建过程中,研发人员在自测过程中的可靠性验证和保证。尤其是

插装工具的重要性:
所谓插装工具,指的是在软件开发过程中,与待开发软件同时运行的,用于监控用户进程运行健康的某些工具。以下列举一些个人使用过的工具:

1. 脚本或者在进程代码中直接进行监控。监控的内容有:用户进程的线程名,线程总数,线程占用的CPU(相对占用情况,不必精确),以及进程占用的总的系统内存情况。 这样在进行研发时,可以快速判断进程的异常运行情况,发现并解决问题。脚本可设置为伴随用户进程在开机时自启,监控脚本可完成用户进程是否在线的检查,用户进程意外退出时,可输出少量的日志用于标识问题产生的时间点等。

例子:某Linux 平台用来监控用户进程的线程数,CPU占用的脚本。监控信息输出至文件存储,并实现固定时间转存。

点击查看代码

#!/bin/sh
# ==============================================================================
# 脚本名称: monitor_threads_v4.sh
# 功能: 监控指定进程的线程CPU占用,支持C/Java/Python等进程
# 特性: 
#   1. 支持进程未启动时自动等待
#   2. 支持进程重启后自动恢复监控
#   3. 优化了 /proc/stat 解析逻辑,准确提取线程名和状态
#   4. 完美支持 Ctrl+C 优雅退出并清理临时文件
#   5. 自动按天分割日志,保留最近7天
# ==============================================================================TARGET_NAME="$1"
INTERVAL="${2:-2}"if [ -z "$TARGET_NAME" ]; thenecho "用法: $0 <进程名> [间隔秒]"exit 1
fi# 获取系统时钟滴答数
CLK_TCK=$(getconf CLK_TCK 2>/dev/null)
[ -z "$CLK_TCK" ] && CLK_TCK=100# 日志配置
DATE_STR=$(date '+%Y-%m-%d')
LOG_DIR="./logs"
mkdir -p "$LOG_DIR"
LOG_FILE="${LOG_DIR}/thread_cpu_log_${DATE_STR}.csv"PREV_FILE="/tmp/mon_prev_$$"
CURR_FILE="/tmp/mon_curr_$$"
> "$PREV_FILE"# ================= 信号处理与清理 =================
cleanup() {echo ""echo "[$(date '+%H:%M:%S')] 收到停止信号,正在清理..."rm -f "$PREV_FILE" "$CURR_FILE"echo "监控已安全停止。"exit 0
}# 捕获 INT (Ctrl+C), TERM (kill), QUIT (Ctrl+\)
trap cleanup INT TERM QUIT# ================= 辅助函数 =================
get_pid() {local name="$1"local pid=""pid=$(ps -ef 2>/dev/null | grep -F -- "$name" | grep -v grep | awk '{if ($1 ~ /^[0-9]+$/) print $1; exit}')if echo "$pid" | grep -qE '^[0-9]+$'; thenecho "$pid"elseecho ""fi
}clean_old_logs() {local log_dir="$1"local keep_count=7if [ ! -d "$log_dir" ]; then return; fi# 删除7天前的日志ls -1 "$log_dir"/thread_cpu_log_*.csv 2>/dev/null | sort -r | tail -n +$((keep_count + 1)) | while read file; dorm -f "$file"done
}wait_for_target() {echo "[$(date)] 正在等待进程 '$TARGET_NAME' 启动..."while true; dolocal pid=$(get_pid "$TARGET_NAME")if [ -n "$pid" ]; thenecho "[$(date)] 检测到进程 (PID: $pid),开始监控。"return 0fi# 可中断的睡眠sleep 1 & wait $! 2>/dev/null || breakdone
}# ================= 主逻辑 =================# 1. 启动时清理旧日志
clean_old_logs "$LOG_DIR"# 2. 初始化日志头
if [ ! -s "$LOG_FILE" ]; thenecho "Timestamp, TID, Thread_Name, CPU_Percent, State" > "$LOG_FILE"
fiecho "开始监控: $TARGET_NAME | 间隔: ${INTERVAL}s | 日志: $LOG_FILE"# 3. 等待进程出现
wait_for_target# 4. 主监控循环
while true; do# --- 跨天检测 ---CURRENT_DATE=$(date '+%Y-%m-%d')if [ "$CURRENT_DATE" != "$DATE_STR" ]; thenDATE_STR="$CURRENT_DATE"LOG_FILE="${LOG_DIR}/thread_cpu_log_${DATE_STR}.csv"echo "Timestamp, TID, Thread_Name, CPU_Percent, State, Thread_Count" > "$LOG_FILE"> "$PREV_FILE"clean_old_logs "$LOG_DIR"echo "[$(date)] 日志已轮转。"fi# --- 动态获取 PID ---CURRENT_PID=$(get_pid "$TARGET_NAME")if [ -z "$CURRENT_PID" ]; then# 进程消失,等待重启sleep "$INTERVAL" & wait $! 2>/dev/null || break# 纯shell取毫秒:读取 /proc/timer_list 或用 /proc/uptime# 方法:读取 /proc/timer_list 中的 now 字段(纳秒)now_ns=$(awk '/now:/ {print $3; exit}' /proc/timer_list 2>/dev/null)if [ -n "$now_ns" ]; thenms="${now_ns:0:3}"else# 备选:用 uptime 微秒us=$(cat /proc/uptime | awk '{print $1}' | cut -d. -f2)ms="${us:0:3}"fiecho "$(date '+%Y-%m-%d %H:%M:%S').${ms} target killed!!!" >> "$LOG_FILE"continuefiTASK_DIR="/proc/${CURRENT_PID}/task"if [ ! -d "$TASK_DIR" ]; thensleep "$INTERVAL" & wait $! 2>/dev/null || breakcontinuefiTIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')> "$CURR_FILE"# 获取线程总数THREAD_COUNT=$(ls "$TASK_DIR" 2>/dev/null | wc -l)# --- 遍历线程并采集数据 ---for STAT_FILE in "$TASK_DIR"/*/stat; do[ -r "$STAT_FILE" ] || continueTID=$(basename "$(dirname "$STAT_FILE")")STAT_LINE=$(cat "$STAT_FILE" 2>/dev/null)[ -z "$STAT_LINE" ] && continue# 【优化】提取线程名:处理括号内可能包含空格或特殊字符的情况TNAME=$(echo "$STAT_LINE" | awk '{start = index($0, "(");end = 0;for (i = length($0); i >= 1; i--) {if (substr($0, i, 1) == ")") { end = i; break; }}if (start > 0 && end > start) print substr($0, start+1, end-start-1);else print "Unknown";}')# 【优化】提取 CPU Ticks 和状态# stat 文件格式: pid (comm) state ppid ... utime(14) stime(15) ...# 移除第一个括号及其内容之前的部分,再移除最后一个括号REST_PART=$(echo "$STAT_LINE" | sed 's/.*) //')# 从剩余部分提取字段:第1个是state, 第12个是utime, 第13个是stime (相对于REST_PART)READ_RESULT=$(echo "$REST_PART" | awk '{utime = $12 + 0; stime = $13 + 0;printf "%d %s", utime + stime, $1;}')CPU_TICKS=$(echo "$READ_RESULT" | awk '{print $1}')TSTATE=$(echo "$READ_RESULT" | awk '{print $2}')# 容错处理if ! echo "$CPU_TICKS" | grep -qE '^[0-9]+$'; thenCPU_TICKS=0 fi[ -z "$TNAME" ] && TNAME="Unknown"[ -z "$TSTATE" ] && TSTATE="?"# 查找上一时刻的 ticksPREV_TICKS=$(awk -v t="$TID" '$1==t {print $2}' "$PREV_FILE")CPU_PCT="0.00"if [ -n "$PREV_TICKS" ]; thenDELTA=$((CPU_TICKS - PREV_TICKS))# 处理计数器溢出或重置情况if [ $DELTA -lt 0 ]; then DELTA=0 fiif [ $DELTA -gt 0 ]; thenCPU_PCT=$(awk "BEGIN{printf \"%.2f\", ($DELTA / $INTERVAL) / $CLK_TCK * 100}")fifi# 记录当前 ticks 供下次使用echo "$TID $CPU_TICKS" >> "$CURR_FILE"# 写入日志echo "$TIMESTAMP, $TID, $TNAME, $CPU_PCT, $TSTATE,$THREAD_COUNT" >> "$LOG_FILE"done# 更新 PREV_FILEmv "$CURR_FILE" "$PREV_FILE"# --- 可中断的睡眠 ---sleep "$INTERVAL" & wait $! 2>/dev/null || break
done

2. 代码静态分析工具 cppcheck-2.18.0-x64-Setup.msi

开源C/C++代码静态分析工具,可检测内存泄漏、数组越界、未定义行为等代码缺陷,适配Linux内核驱动代码检查场景。

http://www.jsqmd.com/news/1366165/

相关文章:

  • Minecraft基岩版Linux启动器:跨平台游戏体验完整指南
  • B站字幕下载终极指南:如何高效获取并转换CC字幕资源
  • VMProtect 3.x x64动态转储完全指南:专业逆向工具VMPDump实战解析
  • 小笑授权系统V7.3开源版核心解析与二次开发指南
  • 留学VIP定制服务到底值不值?—中教无忧私人订制留学 - 滚动商讯
  • 打了 fat jar 之后 SPI 只剩一个实现:ServiceLoader 的 5 个加载边界
  • Anthropic开着6倍薪资抢人,CEO却担心新员工“只为钱来”?遭网友嘲讽:那你降薪试试
  • iOS激活锁终极绕过:AppleRa1n一键解锁iPhone 6s-X完整方案
  • AI辅助游戏开发:从Vibe Coding到独立游戏上线的全流程实践
  • 2026年下半年五常稻花香供应厂家实力解析:五常市庆喜米业有限公司、黑龙江秋然米业有限公司、五常市兴国粮油工贸有限公司 - 卓企推荐
  • BiliTools终极指南:如何用AI智能总结3倍提升B站学习效率
  • 5大核心功能揭秘:SleeperX如何彻底改变Mac电源管理体验
  • Java反编译终极指南:CFR工具从入门到精通实战解析
  • 5分钟快速上手:终极CRT滤镜指南 - 在现代游戏中重现经典显示效果
  • 2026 年太原热镀锌管方管批发,长治晋城管材采购答疑 - LYL仔仔
  • 从业务中屏到垂直智枢:数字孪生在城市治理中的三级价值跃迁
  • 天虹购物卡闲置别吃灰:拒绝绑定锁死,这份安全变现指南请收好 - 购物卡回收找京尔回收
  • 程序员如何通过漏洞挖掘实现技术变现
  • SSM+Vue农产品电商系统开发实战与优化
  • 广州正规网站建设企业如何选择以及避坑指南
  • 青龙面板自动化脚本终极指南:告别繁琐签到,5分钟搞定全平台任务
  • 2026 年佛山高纯度铁粉销售 钢渣生产源头厂家 - LYL仔仔
  • 李晓伟律师团队解读南京心肌梗死未达诊断标准拒赔应对方案 - 行路心安
  • 跨越界限:如何在Mac上轻松制作Windows启动盘
  • 宣威曲靖装修避坑全攻略:本地 23 年家装实战数据 + 真实落地案例 - GrowthUME
  • Python爬虫实战:构建电竞赛事积分数据抓取与可视化分析系统
  • 虚幻引擎逆向分析:从核心数据结构到运行时网格合并实战
  • 如何通过OmenSuperHub完全掌控惠普OMEN游戏本性能:开源风扇控制与功耗解锁终极指南
  • 终极指南:如何在Mac上轻松制作Windows启动盘,完美绕过硬件限制
  • 工业机器人控制柜嵌入式控制硬件选型|强抗震加固设计 异构算力加持多关节协同