处于 `dest`(销毁)状态的共享内存段被哪些进程占用

dest 状态

要查看处于 dest(销毁)状态的共享内存段被哪些进程占用,可以通过以下步骤操作:


✅ 一、获取处于 dest 状态的共享内存段

执行以下命令查看共享内存段:

ipcs -m

示例输出:

0x0052e2c1  327680     oracle     644  dest

这里 327680 是共享内存段的 shmid


✅ 二、查找占用该共享内存段的进程

使用 /proc 文件系统查找哪个进程关联了该共享内存段:

for pid in $(ls /proc | grep -E '^[0-9]+$'); do
  if [ -e /proc/$pid/maps ]; then
    grep -l "Shared memory" /proc/$pid/maps > /dev/null 2>&1 && \
    grep -q $(ipcs -m | grep dest | awk '{print $2}') /proc/$pid/maps && \
    echo "Shared memory segment is attached to PID: $pid"
  fi
done

更准确的方法是:

方法一:使用 lsipc(推荐)

lsipc -m -i <shmid>

示例:

lsipc -m -i 327680

输出中有:

  • Owner
  • Creator PID
  • Last attach/detach PID

方法二:使用 lsof(部分系统支持)

lsof | grep SYSV

✅ 三、杀掉对应进程(如确认无影响)

kill -9 <pid>

清理完成后,可以使用以下命令手动释放共享内存段:

ipcrm -m <shmid>

⚠️ 注意事项

  • 只有在 确认对应进程无重要业务负载 时才可强制结束进程。
  • 如果共享内存段是 Oracle 的,建议通过 Oracle 正常停止数据库进程,再释放资源。
  • 如果频繁出现 dest 状态残留,可能是应用(如 Oracle)没有优雅释放共享资源,建议检查启动/关闭脚本。

脚本

以下是一个自动化脚本,用于列出处于 dest 状态的共享内存段,并找出哪些进程仍在占用这些内存段


🧾 脚本名称:check_orphan_shm.sh

#!/bin/bash

echo "🔍 正在查找处于 'dest' 状态的共享内存段..."
echo "--------------------------------------------"

# 依赖工具检查
if ! command -v ipcs >/dev/null 2>&1; then
  echo "❌ 缺少 ipcs 命令,请安装 sysvinit-utils 包"
  exit 1
fi

# 遍历所有 DEST 状态的共享内存段
for shmid in $(ipcs -m | awk '/dest/ {print $2}'); do
  echo "📌 检测到共享内存段:shmid = $shmid"

  # 遍历系统所有进程,尝试匹配映射的共享内存段
  for pid in $(ls /proc | grep -E '^[0-9]+$'); do
    if [ -r "/proc/$pid/maps" ]; then
      # 查找进程是否引用该共享内存段
      if grep -q "SYSV" /proc/$pid/maps && grep -q "$shmid" /proc/$pid/maps; then
        pname=$(ps -p $pid -o comm=)
        echo "   └─ 占用进程 PID: $pid  (进程名: $pname)"
      fi
    fi
  done

  echo ""
done

echo "✅ 检查完成。可根据 PID 进一步处理(如确认后 kill -9)。"

🧪 使用方法:

  1. 将脚本保存为文件,例如:

    nano check_orphan_shm.sh
    
  2. 赋予执行权限:

    chmod +x check_orphan_shm.sh
    
  3. 运行脚本:

    ./check_orphan_shm.sh
    

🧷 示例输出:

🔍 正在查找处于 'dest' 状态的共享内存段...
--------------------------------------------
📌 检测到共享内存段:shmid = 327680
   └─ 占用进程 PID: 1123  (进程名: oracle)
   └─ 占用进程 PID: 1145  (进程名: ora_pmon)

📌 检测到共享内存段:shmid = 131072
   └─ 占用进程 PID: 2410  (进程名: dbwriter)

如你希望将该脚本加入系统监控,或结合自动清理逻辑(确认后自动 ipcrm),我也可以为你扩展。是否需要自动清理版?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值