目录标题
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)。"
🧪 使用方法:
-
将脚本保存为文件,例如:
nano check_orphan_shm.sh
-
赋予执行权限:
chmod +x check_orphan_shm.sh
-
运行脚本:
./check_orphan_shm.sh
🧷 示例输出:
🔍 正在查找处于 'dest' 状态的共享内存段...
--------------------------------------------
📌 检测到共享内存段:shmid = 327680
└─ 占用进程 PID: 1123 (进程名: oracle)
└─ 占用进程 PID: 1145 (进程名: ora_pmon)
📌 检测到共享内存段:shmid = 131072
└─ 占用进程 PID: 2410 (进程名: dbwriter)
如你希望将该脚本加入系统监控,或结合自动清理逻辑(确认后自动 ipcrm
),我也可以为你扩展。是否需要自动清理版?