You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

关键部分说明

  1. strace -e trace=write:仅跟踪进程的write系统调用,过滤掉无关的系统调用输出,减少处理负担,同时捕获应用的控制台输出(因为控制台输出本质是向stdout/stderr执行write操作)。
  2. 2>&1:将strace默认输出到stderr的内容重定向到stdout,确保所有输出能被后续的while read统一处理。
  3. 流式处理:通过管道直接传递输出,全程在内存中处理,完全避免写入SD卡,解决了你担心的存储损耗问题。
  4. 精准进程管理:通过记录应用PID,避免使用pkill可能误杀其他同名进程的风险,确保只操作目标应用。

注意事项

  • 先安装strace:执行sudo apt update && sudo apt install strace完成安装。
  • 替换配置参数:将APP_NAME、APP_COMMAND、ERROR_STRING替换为你的实际信息。
  • 测试验证:可以先编写一个简单的测试程序(比如循环输出普通内容,偶尔输出异常字符串),验证脚本是否能正确触发重启。
  • 后台运行脚本:可以用nohup ./monitor_script.sh &让脚本在后台常驻,即使断开SSH连接也能继续运行。

内容的提问来源于stack exchange,提问作者Psiloc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:30:43