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

如何处理Shell脚本do语句中/proc/PID/status文件不存在的异常?

解决Shell脚本中/proc/PID/status文件不存在的报错问题

问题场景

你编写的Shell脚本片段如下:

..
do
PID=$(echo $i | cut -d: -f1)
THREADS=$(cat /proc/$PID/status | grep -i "Threads" | awk '{print $2}')
done
..

但部分进程对应的/proc/$PID/status文件不存在,执行脚本时会抛出如下错误:

$ ./check_memory.sh
cat: /proc/9809/status: No such file or directory
$

期望实现当文件不存在时,输出指定提示,示例输出如下:

Memory Usage Per Process
----------------------------------------
PID       THREADS                                              
9936      129                                                       
9809      There is no status file for this process   

解决方案

修改脚本,在读取/proc/$PID/status前先检查文件是否存在,同时避免cat命令的报错输出,具体修改如下:

# 打印表头
echo "Memory Usage Per Process"
echo "----------------------------------------"
echo "PID       THREADS"

# 循环处理进程(假设$i来自你的进程遍历逻辑)
..
do
PID=$(echo "$i" | cut -d: -f1)
# 检查文件是否存在且可读
if [ -r "/proc/$PID/status" ]; then
    # 直接用grep读取文件,减少不必要的进程调用
    THREADS=$(grep -i "Threads" "/proc/$PID/status" | awk '{print $2}')
    printf "%-8s %s\n" "$PID" "$THREADS"
else
    printf "%-8s There is no status file for this process\n" "$PID"
fi
done
..

关键说明

  • 使用[ -r "/proc/$PID/status" ]判断文件是否存在且当前用户有读取权限,覆盖文件不存在、无权限两种异常场景
  • 用grep直接读取目标文件,替代cat | grep的写法,避免无意义的进程创建
  • 用printf格式化输出,保证PID与内容的对齐格式和示例一致
  • 异常分支直接输出指定提示,不会再抛出cat的报错信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:55:45