如何用Shell脚本监控strace并重启异常的Raspberry Pi 4专有应用
实时监控strace输出并自动重启进程的Shell脚本方案
核心思路
直接通过管道将strace的输出流式传递给过滤逻辑,全程不写入SD卡,实时检测异常字符串。一旦匹配到目标内容,立即终止进程并重启,避免循环读取历史记录的低效操作。
完整脚本实现
#!/bin/bash # 配置参数:替换为你的应用信息 APP_NAME="your_proprietary_app" APP_COMMAND="/full/path/to/your/app_executable" ERROR_STRING='Time taken to process image --249' # 存储应用PID,用于精准终止进程 APP_PID="" # 重启应用函数 restart_app() { # 终止现有进程(如果存在) if [ -n "$APP_PID" ]; then echo "$(date): 终止进程 $APP_PID" kill "$APP_PID" 2>/dev/null # 等待进程完全退出 wait "$APP_PID" 2>/dev/null fi # 短暂等待确保资源释放 sleep 2 echo "$(date): 启动新应用实例..." # 启动应用并通过strace跟踪输出,后台运行 nohup strace -e trace=write "$APP_COMMAND" 2>&1 | while read -r line; do # 实时检查每行输出是否匹配异常 if echo "$line" | grep -q "$ERROR_STRING"; then echo "$(date): 检测到异常字符串:$ERROR_STRING" # 触发重启并退出当前循环 restart_app break fi done & # 记录新启动进程的PID APP_PID=$! } # 初始启动应用 echo "$(date): 初始化启动应用..." restart_app # 保持脚本常驻(可选,若依赖nohup则可省略) wait
关键部分说明
strace -e trace=write:仅跟踪进程的write系统调用,过滤掉无关的系统调用输出,减少处理负担,同时捕获应用的控制台输出(因为控制台输出本质是向stdout/stderr执行write操作)。2>&1:将strace默认输出到stderr的内容重定向到stdout,确保所有输出能被后续的while read统一处理。- 流式处理:通过管道直接传递输出,全程在内存中处理,完全避免写入SD卡,解决了你担心的存储损耗问题。
- 精准进程管理:通过记录应用PID,避免使用
pkill可能误杀其他同名进程的风险,确保只操作目标应用。
注意事项
- 先安装
strace:执行sudo apt update && sudo apt install strace完成安装。 - 替换配置参数:将
APP_NAME、APP_COMMAND、ERROR_STRING替换为你的实际信息。 - 测试验证:可以先编写一个简单的测试程序(比如循环输出普通内容,偶尔输出异常字符串),验证脚本是否能正确触发重启。
- 后台运行脚本:可以用
nohup ./monitor_script.sh &让脚本在后台常驻,即使断开SSH连接也能继续运行。
内容的提问来源于stack exchange,提问作者Psiloc
相关产品推荐
相关产品推荐

