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
相关产品推荐
相关产品推荐

