【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效)

【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效)

在Linux/Windows中做项目,基本每天都有新问题!!!

(关注不迷路哈!!!)

文章目录

  • [【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效)](#【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效))

一、需求分析

1. ✅在 Windows 中编写一个 run_stress_test.sh 脚本

  • 执行 4 小时(14400 秒)的 stressapptest 压测,命令为:

    bash 复制代码
    stressapptest -s 14400 -i 4 -C 4 -W --stop_on_errors -M 128
  • 通过RGB运行灯(三色灯,红绿蓝)的亮灯颜色状态来监视压测情况,要求为:

bat 复制代码
测试开始时:黄色
测试成功时:绿色
测试失败时:红色

红、绿、蓝三种颜色进行开关组合后可能产生的颜色汇总表

红色开关状态 绿色开关状态 蓝色开关状态 混合后颜色名称 十六进制颜色代码 RGB 数值 (R, G, B)
关 (0) 关 (0) 关 (0) 黑色 #000000 (0, 0, 0)
关 (0) 关 (0) 开 (255) 纯蓝 #0000FF (0, 0, 255)
关 (0) 开 (255) 关 (0) 纯绿 #00FF00 (0, 255, 0)
关 (0) 开 (255) 开 (255) 青色 (Cyan) #00FFFF (0, 255, 255)
开 (255) 关 (0) 关 (0) 纯红 #FF0000 (255, 0, 0)
开 (255) 关 (0) 开 (255) 品红色 / 洋红 (Magenta) #FF00FF (255, 0, 255)
开 (255) 开 (255) 关 (0) 黄色 (Yellow) #FFFF00 (255, 255, 0)
开 (255) 开 (255) 开 (255) 白色 #FFFFFF (255, 255, 255)

LED 实际设置

颜色 含义 对应 LED 设置
绿色 测试成功 R=0, G=255, B=0
黄色 正在运行测试 R=255, G=255, B=0
红色 测试失败 R=255, G=0, B=0

💡 提示:可以通过 cat /sys/class/leds/runled*/brightness 查看当前亮度值验证是否生效。

2. ✅在 Windows 中 编写一个 运行老化测试脚本.bat 脚本

  • 推送 run_stress_test.sh 脚本到设备
  • 设置可执行权限
  • 执行该脚本

3. ✅脚本内容相关要求

  • 压测完成后指示灯能够从黄色灯转为绿色

  • 在关闭 Windows 的命令行窗口,Linux设备上的测试保持继续运行

  • 通电情况下,要是压测过程中出现中断或任何错误导致无法成功压测4小时,则指示灯显示红色


二、撰写过程中的难题与解决方案

第一步:Linux Shell 脚本 ---- run_stress_test.sh 文件

✅完整版:setsid + 信号处理
bash 复制代码
#!/usr/bin/bash

# 功能: 执行 4 小时 stressapptest 压测,并通过 RGB LED 显示状态
# 使用说明: 放置在 /userdata/proagetest 目录下并执行

# 定义 LED 控制路径
RED_LED="/sys/class/leds/runledred/brightness"
GREEN_LED="/sys/class/leds/runledgreen/brightness"
BLUE_LED="/sys/class/leds/runledblue/brightness"

# 测试成功时为绿色
set_green() {
    echo 0 > "$RED_LED"
    echo 255 > "$GREEN_LED"
    echo 0 > "$BLUE_LED"
}

# 测试开始时设置黄色:红 + 绿
set_yellow() {
    echo 255 > "$RED_LED"
    echo 255 > "$GREEN_LED"
    echo 0 > "$BLUE_LED"
}

# 测试失败时设置红色
set_red() {
    echo 255 > "$RED_LED"
    echo 0 > "$GREEN_LED"
    echo 0 > "$BLUE_LED"
}

# 信号处理函数
cleanup() {
    echo "Test interrupted. Setting LED to RED."
    set_red
    exit 1
}

# 注册信号处理
trap cleanup SIGINT SIGTERM SIGHUP

# 主要压测命令
STRESS_CMD="stressapptest -s 14400 -i 4 -C 4 -W --stop_on_errors -M 128"

# 开始压测前提示
echo "Starting stress test for 4 hours..."
echo "LED will turn YELLOW during test."

# 设置为黄色(开始测试)
set_yellow

# 执行压测(使用 setsid 确保完全独立运行)
echo "Running command: $STRESS_CMD"
setsid $STRESS_CMD > /dev/null 2>&1 &

# 记录后台进程PID
STRESS_PID=$!

# 等待测试完成
echo "Waiting for stress test to complete..."
wait $STRESS_PID

# 检查结果
if [ $? -eq 0 ]; then
    echo "Stress test PASSED!"
    # 恢复为绿色
    set_green
else
    echo "Stress test FAILED with exit code: $?"
    # 显示红色
    set_red
fi

# 记录结束标志
echo "Test completed. Writing end flag."
echo 1 >> /userdata/proagetest/OldTestLog.txt

echo "Script finished."
✅关键技术点解释
  1. setsid 命令

    • 创建新的会话,使进程完全独立于父进程
    • nohup 更可靠地防止会话终止影响进程
  2. 完整的后台运行

    • setsid command > /dev/null 2>&1 &
    • 重定向所有输出并放入后台
  3. 进程管理

    • 使用 $! 获取后台进程PID
    • 使用 wait $PID 等待特定进程
  4. 使用 cleanup() 信号处理函数,可以最大程度确保在各种异常情况下都能正确更新 LED 状态


第二步:Windows 命令脚本 ---- 运行老化测试脚本.bat 文件

✅版本1:合并监控和执行脚本
bat 复制代码
@echo off
adb shell mkdir -p /userdata/proagetest

adb push ./run_stress_test.sh /userdata/proagetest/run_stress_test.sh

adb shell chmod +x /userdata/proagetest/run_stress_test.sh

:: === 测试已启动,可以在设备上查看 LED 状态变化,成功完成4小时测试后LED将变为绿色,失败则变为红色,但关闭命令窗口会影响测试运行 ===
adb shell "cd /userdata/proagetest && nohup ./run_stress_test.sh &"
:: adb shell "cd /userdata/proagetest && setsid ./run_stress_test.sh > /dev/null 2>&1 &"

pause

对于下面的语句,如果中途出现压测异常,这部分检查代码会执行;但如果强行终止整个脚本进程,则不会执行。

bash 复制代码
# 检查结果
if [ $? -eq 0 ]; then
    echo "Stress test PASSED!"
    # 恢复为绿色
    set_green
else
    echo "Stress test FAILED with exit code: $?"
    # 显示红色
    set_red
fi

当 stressapptest 运行中出现异常(如程序崩溃)

  • wait 命令会立即返回
  • $? 会包含异常退出码(非0)
  • 检查代码会执行
  • LED 会变为红色

当强行终止整个脚本进程(如关闭 Windows 命令行窗口)

  • adb shell 会话被终止

  • 整个 shell 进程被杀死,脚本立即停止执行

  • if [ $? -eq 0 ] 这部分代码不会执行,无法执行 LED 状态更新代码

  • LED 状态保持为黄色(不会更新)

场景 是否能继续运行 LED 是否正确更新
正常完成 ✅ 能 ✅ 能
程序内部错误 ✅ 能 ✅ 能
关闭 Windows 窗口 ❌ 不能保证 ❌ 不能保证
设备断开连接 ❌ 不能保证 ❌ 不能保证
✅版本2:分离监控和执行脚本
bat 复制代码
@echo off
adb shell mkdir -p /userdata/proagetest

:: 推送所有文件到设备
adb push ./run_stress_test.sh /userdata/proagetest/run_stress_test.sh
adb push ./start_test.sh /userdata/proagetest/start_test.sh

:: 设置文件权限
adb shell chmod +x /userdata/proagetest/run_stress_test.sh
adb shell chmod +x /userdata/proagetest/start_test.sh

:: 启动测试
:: === 测试已启动,可以在设备上查看 LED 状态变化,成功完成4小时测试后LED将变为绿色,失败则变为红色,关闭命令窗口不会影响测试运行 ===
adb shell "cd /userdata/proagetest && ./start_test.sh"

pause
  1. 新增 start_test.sh 启动脚本
bash 复制代码
#!/bin/bash

# 功能: 启动 stress 测试
# 使用说明: 放置在 /userdata/proagetest 目录下并执行

cd /userdata/proagetest
setsid ./run_stress_test.sh > /dev/null 2>&1 &
echo "Test started......"
  1. 维持 run_stress_test.sh 执行脚本(如上所示)

分离脚本的优势

  • 完全独立运行start_test.sh 启动后立即返回,不会阻塞
  • 抗干扰性强:即使关闭 Windows 命令行窗口,测试也会继续运行
  • 信号处理完善run_stress_test.sh 中的信号处理可以捕获各种异常情况
  • LED状态保证:无论正常完成还是异常中断,LED 都会正确更新

三、在设备上验证测试是否正常运行

bash 复制代码
# 查看运行中的进程
ps | grep stressapptest

# 查看脚本进程
ps | grep run_stress_test

# 查看LED状态
cat /sys/class/leds/runled*/brightness

# 查看结束标志
cat /userdata/proagetest/OldTestLog.txt

这样修改后,即使你关闭 Windows 命令行窗口,设备上的测试也会完全独立运行,并且在任何情况下都能正确更新 LED 状态。

总结

采用本文提供的完整解决方案,使用 setsid + 信号处理 + 分离脚本 的方法来确保在所有情况下都能满足需求。

1. 使用 setsid 替换 nohup

bash 复制代码
# 执行压测(使用 setsid 确保完全独立运行)
echo "Running command: $STRESS_CMD"
setsid $STRESS_CMD > /dev/null 2>&1 &

# 等待测试完成
wait

2. 分离启动和执行脚本

创建两个脚本

  1. 启动脚本:负责启动测试并立即返回
  2. 执行脚本:负责实际测试和 LED 控制

3. 添加信号处理

bash 复制代码
# 信号处理函数
cleanup() {
    echo "Test interrupted. Setting LED to RED."
    set_red
    exit 1
}

# 注册信号处理
trap cleanup SIGINT SIGTERM SIGHUP
相关推荐
MeowKnight9582 小时前
【Qt】Qt实践记录2——TCP通信服务器和客户端demo
笔记·qt
程序员龙一2 小时前
C++之static_cast关键字
开发语言·c++·static_cast
itachi-uchiha2 小时前
head和tail命令使用
linux·运维·服务器
yue0082 小时前
C# 分部类读取学生信息
开发语言·c#
申克Lab2 小时前
STM32 串口概念 UART协议
stm32·单片机·嵌入式硬件
奶茶树2 小时前
【C++/STL】map和multimap的使用
开发语言·c++·stl
小莞尔2 小时前
【51单片机】【protues仿真】基于51单片机自动浇花系统
单片机·嵌入式硬件
聪明努力的积极向上3 小时前
【C#】事件简单解析
开发语言·c#
馨谙3 小时前
SELinux 故障排除完全指南:从拒绝访问到快速修复
linux