什么是 ipcrm?
ipcrm 是 "Inter-Process Communication Resource Remove" 的缩写,意为“进程间通信资源移除”,它是一个在 Linux 和类 Unix 系统上用于手动删除由系统创建的 IPC 对象的命令行工具。

这些 IPC 对象包括:
- 共享内存
- 信号量
- 消息队列
当一个进程创建了这些 IPC 资源后,即使该进程已经终止,这些资源通常也会保留在系统中,直到:
- 系统重启。
- 另一个进程显式地删除它们。
- 使用
ipcrm命令手动删除。
如果这些“孤儿”资源没有被及时清理,它们会一直占用系统资源(如内存、内核对象标识符),最终可能导致系统资源耗尽,无法创建新的 IPC 资源。ipcrm 是系统管理和故障排查中一个非常有用的工具。
为什么需要 ipcrm?
想象一下这个场景:

- 一个程序启动,创建了一个 1GB 的共享内存段用于数据处理。
- 程序运行过程中崩溃或被强制杀死,但没有机会清理它创建的共享内存。
- 这个 1GB 的共享内存现在变成了“僵尸”资源,无法被任何程序访问,但内核仍然认为它存在。
- 如果这种情况多次发生,系统的可用内存就会被这些无用的 IPC 资源耗尽。
ipcrm 的作用就是在这种情况下,强制删除这些残留的 IPC 资源,释放系统资源。
如何使用 ipcrm?
ipcrm 命令的基本语法有两种形式:
通过资源 ID 删除(最常用)
ipcrm [ -m <shmid> ] [ -M <shmkey> ] [ -q <msqid> ] [ -Q <msgkey> ] [ -s <semid> ] [ -S <semkey> ]
通过资源 ID 删除(另一种形式)
ipcrm <resource_id>
通过模式删除(谨慎使用)
ipcrm -Q <msgkey> -m <shmkey> -M <shmkey> -q <msqid> -Q <msgkey> -s <semid> -S <semkey>
这种形式会删除所有与指定键关联的资源,非常强大但也非常危险,容易误删。
命令选项详解
| 选项 | 全称 | 说明 | 示例 |
|---|---|---|---|
-m <shmid> |
--shmem-id |
删除指定共享内存 ID 的共享内存段。 | ipcrm -m 12345 |
-M <shmkey> |
--shmem-key |
删除指定共享内存键 的共享内存段。 | ipcrm -M 0x12345678 |
-q <msqid> |
--queue-id |
删除指定消息队列 ID 的消息队列。 | ipcrm -q 54321 |
-Q <msgkey> |
--queue-key |
删除指定消息队列键 的消息队列。 | ipcrm -Q 0x87654321 |
-s <semid> |
--semaphore-id |
删除指定信号量集 ID 的信号量集。 | ipcrm -s 9876 |
-S <semkey> |
--semaphore-key |
删除指定信号量键 的信号量集。 | ipcrm -S 0xabcdef |
-a |
--all |
(危险) 删除所有当前用户有权删除的 IPC 资源。 | ipcrm -a |
实战演练
在删除资源之前,我们首先需要知道有哪些资源存在,可以使用 ipcs 命令来查看。

步骤 1:查看现有的 IPC 资源
# 查看所有类型的 IPC 资源 ipcs # 只查看共享内存 ipcs -m # 只查看消息队列 ipcs -q # 只查看信号量 ipcs -s
假设我们运行 ipcs -m 后看到如下输出:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 987654 myuser 600 65536 2 dest
0x12345678 54321 myuser 666 1048576 0
这里有两个共享内存段:
- ID 为
987654,键为0x00000000 - ID 为
54321,键为0x12345678
步骤 2:使用 ipcrm 删除资源
示例 1:通过 ID 删除共享内存
我们想删除 ID 为 54321 的共享内存段。
ipcrm -m 54321
或者使用另一种语法:
ipcrm 54321
执行后,再次运行 ipcs -m,你会发现 ID 为 54321 的那一行已经消失了。
示例 2:通过键删除共享内存
假设我们不知道 ID,但知道键是 0x00000000。
ipcrm -M 0x00000000
示例 3:删除消息队列
假设 ipcs -q 显示:
------ Message Queues --------
key msqid owner perms used-bytes messages
0xabcdef 11111 myuser 644 0 0
删除 ID 为 11111 的消息队列:
ipcrm -q 11111
示例 4:删除信号量
假设 ipcs -s 显示:
------ Semaphore Arrays --------
key semid owner perms nsems
0xfedcba 22222 myuser 600 1
删除 ID 为 22222 的信号量集:
ipcrm -s 22222
重要注意事项
- 权限问题:你只能删除由你自己拥有的 IPC 资源,或者是
root用户才能删除所有用户的资源,如果你尝试删除别人的资源,会得到Permission denied的错误。 - 谨慎使用
-a选项:ipcrm -a会删除你所有的 IPC 资源,包括那些正在被其他进程正常使用的资源,这可能会导致其他程序崩溃,请确保你了解其后果后再使用。 - 先检查后删除:在执行删除操作前,强烈建议先用
ipcs确认你要删除的资源的 ID 或键,避免误删。 - 根本原因:虽然
ipcrm能解决问题,但它只是治标不治本,更好的做法是找到并修复那个创建资源后没有正确清理的“坏”程序,这通常需要查看程序代码,确保它在退出时调用了相应的清理函数(如shmctlwithIPC_RMID)。 - 键为 0 的情况:键为
0x00000000的 IPC 资源通常是由System V函数在IPC_PRIVATE标志下创建的,它们通常没有外部键,只能通过 ID 来删除。
ipcrm 是一个简单但功能强大的系统管理工具,专门用于清理那些因程序异常退出而遗留在系统中的“孤儿” IPC 资源,掌握它的使用方法,对于维护 Linux 系统的稳定性和性能至关重要,记住它的核心原则:先用 ipcs 查看,再用 ipcrm 删除。
