如何处理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
相关产品推荐
相关产品推荐

