登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux lsipc 怎样以 JSON 读取共享内存段信息

来源:17golang原创

时间:2026-10-30 17:58:07 251浏览 收藏

如果值班脚本需要读取共享内存段,最短写法是把资源范围和输出格式同时限定:lsipc --shmems --json。其中 --shmems 只选择 System V 共享内存段,--json 负责机器可读输出;它只展示当前调用进程有读取权限的 IPC 信息,不负责创建或清理资源。

官方地址:https://github.com/util-linux/util-linux/blob/master/sys-utils/lsipc.1.adoc

如果要把结果接入监控或巡检,建议再显式指定字段,不要依赖默认表格列。下面按“范围、格式、字段、边界”整理一套可直接改进脚本的写法。

先用 --shmems 锁定 System V 共享内存

lsipc 同时面向 POSIX 和 System V IPC。标题中的“共享内存段”通常对应 System V 资源,因此先用 --shmems,避免消息队列、信号量等其它对象进入同一份采集结果。

lsipc 选择 System V 共享内存段及其 ID KEY 权限和大小字段的静态关系图
图1:结构说明图,查看 lsipc、System V 共享内存段与关键字段的静态关系。
# 只读取 System V 共享内存段,并输出机器可读的 JSON
lsipc --shmems --json

# 查看帮助中的列名,先确认当前 util-linux 提供哪些字段
lsipc --help

文档还说明,命令只报告调用进程有读取权限的设施。因而“没有看到某个段”不能直接等同于“系统里不存在”,还要结合执行用户和权限边界判断。

用 JSON 和固定列让采集脚本更稳定

默认输出以及带预定义列的输出可能随版本变化。脚本需要稳定输入时,应把关键列写进 --output,再按消费方要求决定单位和权限表示。

lsipc JSON 输出选项与固定字段契约和运维采集脚本之间的静态关系图
图2:关系说明图,查看 JSON 输出选项如何与固定字段契约和采集脚本连接。
# 固定共享内存段的核心列,避免脚本依赖默认列顺序
lsipc --shmems --json --output=ID,KEY,OWNER,PERMS,BYTES,CPID,LPID,NATTCH

# 让大小统一使用字节,权限使用数字,时间使用 ISO 形式
lsipc --shmems --json --bytes --numeric-perms --time --time-format iso

--bytes 适合阈值判断和数值上报;--numeric-perms 适合权限比较;--time 配合 --time-format iso 适合跨主机记录时间。不同发行版的列名以本机 lsipc --help 为准,稳定性来自“显式选列”,不是来自记住某次默认输出。

按 ID 定位单个段,并保留回滚路径

当巡检先发现某个共享内存 ID 需要进一步查看时,可以把 -i 与 -m 组合使用,再保留 JSON 格式:

# 用实际发现的 System V 段 ID 查询单个资源的完整信息
lsipc --shmems --id 12345 --json

# 生产脚本修改前先保存原始 JSON,便于回滚和复盘
lsipc --shmems --json > /var/tmp/lsipc-shmem-before.json

这里的 12345 只是命令格式示例,不代表某台机器上真实存在的资源。lsipc 只负责读取;如果后续确实需要删除资源,应由经过授权的变更流程使用专门工具处理,不能把读取命令当成清理命令。

常见误区:System V、POSIX 与默认输出

第一,--shmems 是 System V 共享内存;POSIX 共享内存要用 --posix-shmems,两者不能靠同一个筛选参数混为一谈。第二,JSON 只改变输出格式,不会扩大读取权限。第三,默认列是给人看的便利输出,长期脚本应固定 --output 并明确单位。

值班确认可以按下面的顺序记录:资源类型是否正确、执行用户是否有读权限、字段是否显式选择、大小是否统一为字节、时间是否统一为 ISO,以及原始 JSON 是否已按变更单保存。若只是临时查看,lsipc --shmems --json 足够;若要被程序消费,就把字段契约写入脚本并在 util-linux 升级后复查。

相关问题

lsipc 的 JSON 能不能直接用于监控?可以作为输入,但建议固定 --output,并在采集器中处理权限不足、空资源和发行版列差异。

为什么看不到某个共享内存段?先确认它是 System V 还是 POSIX,再检查当前用户对 IPC 设施是否有读取权限,最后确认筛选参数没有选错。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>