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

Linux进程崩溃时收集/proc/<pid>信息的方法咨询

可行的解决方案

1. 利用Core Dump + 自定义后处理脚本

Linux下进程崩溃时默认会生成core dump,你可以通过配置让系统在生成core dump的同时触发脚本收集/proc相关信息:

  • 第一步:开启core dump并配置基础路径
    修改/etc/sysctl.conf添加以下内容:

    kernel.core_pattern = /var/crash/core-%e-%p-%t
    kernel.core_uses_pid = 1
    

    执行sysctl -p让配置生效。

  • 第二步:编写崩溃收集脚本(示例路径/usr/local/bin/crash_collector.sh)
    这个脚本会通过管道被core dump机制调用,先收集/proc信息再生成core dump:

    #!/bin/bash
    CRASH_DIR="/var/crash/proc_info"
    mkdir -p $CRASH_DIR
    
    # 从参数获取崩溃进程的PID、名称和时间戳
    PROC_NAME=$1
    PID=$2
    TIMESTAMP=$3
    PROC_SAVE_DIR="$CRASH_DIR/${PROC_NAME}_${PID}_${TIMESTAMP}"
    mkdir -p $PROC_SAVE_DIR
    
    # 复制目标进程的/proc信息,忽略动态文件的读取报错
    cp -r /proc/$PID/* $PROC_SAVE_DIR/ 2>/dev/null
    # 额外收集系统全局的proc信息用于对比
    cp /proc/cpuinfo $CRASH_DIR/global_cpuinfo_${TIMESTAMP}
    cp /proc/meminfo $CRASH_DIR/global_meminfo_${TIMESTAMP}
    
    # 继续完成core dump的生成
    cat > /var/crash/core-${PROC_NAME}-${PID}-${TIMESTAMP}
    

    给脚本添加执行权限:chmod +x /usr/local/bin/crash_collector.sh

  • 第三步:修改core_pattern为管道触发脚本
    更新/etc/sysctl.conf中的kernel.core_pattern:

    kernel.core_pattern = |/usr/local/bin/crash_collector.sh %e %p %t
    

    再次执行sysctl -p生效,之后进程崩溃时就会自动触发信息收集。

2. 用GDB自动收集崩溃信息

如果你是手动启动进程,可以用GDB包装启动,让进程崩溃时自动执行收集逻辑:

编写一个GDB脚本(示例路径crash_gdb_script.gdb):

set pagination off
# 配置日志保存路径
set logging file /var/crash/gdb_proc_%p.log
set logging on
# 收集目标进程的/proc信息
shell mkdir -p /var/crash/proc_%p
shell cp -r /proc/$PID/* /var/crash/proc_%p/ 2>/dev/null
# 收集崩溃时的完整栈信息
bt full
set logging off
quit

用GDB启动目标进程:

gdb --batch -x crash_gdb_script.gdb --args ./your_target_process arg1 arg2

进程崩溃时,GDB会自动执行脚本,把/proc信息和崩溃栈日志保存到指定目录。

3. 轻量级进程监控脚本

如果需要长期监控某个特定进程,可以用bash脚本定时检查状态,进程异常退出时立即收集信息:

#!/bin/bash
TARGET_PROC="your_process_name"
CRASH_DIR="/var/crash/proc_monitor"
mkdir -p $CRASH_DIR

while true; do
  PID=$(pgrep $TARGET_PROC)
  if [ -n "$PID" ]; then
    # 等待进程退出,获取退出状态
    wait $PID
    EXIT_CODE=$?
    # 非0退出码判定为异常崩溃
    if [ $EXIT_CODE -ne 0 ]; then
      TIMESTAMP=$(date +%Y%m%d_%H%M%S)
      PROC_SAVE_DIR="$CRASH_DIR/proc_${PID}_${TIMESTAMP}"
      mkdir -p $PROC_SAVE_DIR
      cp -r /proc/$PID/* $PROC_SAVE_DIR/ 2>/dev/null
      echo "进程$PID于$TIMESTAMP崩溃,退出码$EXIT_CODE" >> $CRASH_DIR/crash_record.txt
    fi
  else
    sleep 1
  fi
done

注意事项

  • 确保脚本有足够权限读取/proc目录和写入目标保存路径。
  • /proc/$PID下部分文件是动态生成的,复制时出现的报错可以用2>/dev/null忽略。
  • 高频崩溃场景下要定期清理旧的收集文件,避免磁盘空间耗尽。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:30