【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效)
在Linux/Windows中做项目,基本每天都有新问题!!!
(关注不迷路哈!!!)
文章目录
- [【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效)](#【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效))
-
- 一、需求分析
-
- [1. ✅在 Windows 中编写一个 run_stress_test.sh 脚本](#1. ✅在 Windows 中编写一个 run_stress_test.sh 脚本)
- [2. ✅在 Windows 中 编写一个 运行老化测试脚本.bat 脚本](#2. ✅在 Windows 中 编写一个 运行老化测试脚本.bat 脚本)
- [3. ✅脚本内容相关要求](#3. ✅脚本内容相关要求)
- 二、撰写过程中的难题与解决方案
-
- [第一步:Linux Shell 脚本 ---- run_stress_test.sh 文件](#第一步:Linux Shell 脚本 ---- run_stress_test.sh 文件)
-
- [✅完整版:setsid + 信号处理](#✅完整版:setsid + 信号处理)
- ✅关键技术点解释
- [第二步:Windows 命令脚本 ---- 运行老化测试脚本.bat 文件](#第二步:Windows 命令脚本 ---- 运行老化测试脚本.bat 文件)
- 三、在设备上验证测试是否正常运行
- 总结
-
- [1. 使用 setsid 替换 nohup](#1. 使用 setsid 替换 nohup)
- [2. 分离启动和执行脚本](#2. 分离启动和执行脚本)
- [3. 添加信号处理](#3. 添加信号处理)
一、需求分析
1. ✅在 Windows 中编写一个 run_stress_test.sh 脚本
-
执行 4 小时(14400 秒)的
stressapptest压测,命令为:bashstressapptest -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."
✅关键技术点解释
-
setsid 命令:
- 创建新的会话,使进程完全独立于父进程
- 比
nohup更可靠地防止会话终止影响进程
-
完整的后台运行:
setsid command > /dev/null 2>&1 &- 重定向所有输出并放入后台
-
进程管理:
- 使用
$!获取后台进程PID - 使用
wait $PID等待特定进程
- 使用
-
使用 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
- 新增 start_test.sh 启动脚本
bash
#!/bin/bash
# 功能: 启动 stress 测试
# 使用说明: 放置在 /userdata/proagetest 目录下并执行
cd /userdata/proagetest
setsid ./run_stress_test.sh > /dev/null 2>&1 &
echo "Test started......"
- 维持 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. 分离启动和执行脚本
创建两个脚本
- 启动脚本:负责启动测试并立即返回
- 执行脚本:负责实际测试和 LED 控制
3. 添加信号处理
bash
# 信号处理函数
cleanup() {
echo "Test interrupted. Setting LED to RED."
set_red
exit 1
}
# 注册信号处理
trap cleanup SIGINT SIGTERM SIGHUP