7. ipcs 查询进程间通信状态

ipcs是Linux下显示进程间通信设施状态的工具。可以显示消息队列、共享内存和信号量的信息。对于程序员非常有用,普通的系统管理员一般用不到此指令。

7.1. IPC资源查询

查看系统使用的IPC资源

  1. $ipcs
  2.  
  3. ------ Shared Memory Segments --------
  4. key shmid owner perms bytes nattch status
  5.  
  6. ------ Semaphore Arrays --------
  7. key semid owner perms nsems
  8. 0x00000000 229376 weber 600 1
  9.  
  10. ------ Message Queues --------
  11. key msqid owner perms used-bytes messages

分别查询IPC资源:

  1. $ipcs -m 查看系统使用的IPC共享内存资源
  2. $ipcs -q 查看系统使用的IPC队列资源
  3. $ipcs -s 查看系统使用的IPC信号量资源

查看IPC资源被谁占用

示例:有个IPCKEY(51036),需要查询其是否被占用;

  • 首先通过计算器将其转为十六进制:
  1. 51036 -> c75c
  • 如果知道是被共享内存占用:
  1. $ipcs -m | grep c75c
  2. 0x0000c75c 40403197 tdea3 666 536870912 2
  • 如果不确定,则直接查找:
  1. $ipcs | grep c75c
  2. 0x0000c75c 40403197 tdea3 666 536870912 2
  3. 0x0000c75c 5079070 tdea3 666 4

7.2. 系统IPC参数查询

  1. ipcs -l
  2.  
  3. ------ Shared Memory Limits --------
  4. max number of segments = 4096
  5. max seg size (kbytes) = 4194303
  6. max total shared memory (kbytes) = 1073741824
  7. min seg size (bytes) = 1
  8.  
  9. ------ Semaphore Limits --------
  10. max number of arrays = 128
  11. max semaphores per array = 250
  12. max semaphores system wide = 32000
  13. max ops per semop call = 32
  14. semaphore max value = 32767
  15.  
  16. ------ Messages: Limits --------
  17. max queues system wide = 2048
  18. max size of message (bytes) = 524288
  19. default max size of queue (bytes) = 5242880

以上输出显示,目前这个系统的允许的最大内存为1073741824kb;最大可使用128个信号量,每个消息的最大长度为524288bytes;

7.3. 修改IPC系统参数

以linux系统为例,在root用户下修改/etc/sysctl.conf 文件,保存后使用sysctl -p生效:

  1. $cat /etc/sysctl.conf
  2. # 一个消息的最大长度
  3. kernel.msgmax = 524288
  4.  
  5. # 一个消息队列上的最大字节数
  6. # 524288*10
  7. kernel.msgmnb = 5242880
  8.  
  9. #最大消息队列的个数
  10. kernel.msgmni=2048
  11.  
  12. #一个共享内存区的最大字节数
  13. kernel.shmmax = 17179869184
  14.  
  15. #系统范围内最大共享内存标识数
  16. kernel.shmmni=4096
  17.  
  18. #每个信号灯集的最大信号灯数 系统范围内最大信号灯数 每个信号灯支持的最大操作数 系统范围内最大信号灯集数
  19. #此参数为系统默认,可以不用修改
  20. #kernel.sem = <semmsl> <semmni>*<semmsl> <semopm> <semmni>
  21. kernel.sem = 250 32000 32 128

显示输入不带标志的 ipcs:的输出:

  1. $ipcs
  2. IPC status from /dev/mem as of Mon Aug 14 15:03:46 1989
  3. T ID KEY MODE OWNER GROUP
  4. Message Queues:
  5. q 0 0x00010381 -Rrw-rw-rw- root system
  6. q 65537 0x00010307 -Rrw-rw-rw- root system
  7. q 65538 0x00010311 -Rrw-rw-rw- root system
  8. q 65539 0x0001032f -Rrw-rw-rw- root system
  9. q 65540 0x0001031b -Rrw-rw-rw- root system
  10. q 65541 0x00010339--rw-rw-rw- root system
  11. q 6 0x0002fe03 -Rrw-rw-rw- root system
  12. Shared Memory:
  13. m 65537 0x00000000 DCrw------- root system
  14. m 720898 0x00010300 -Crw-rw-rw- root system
  15. m 65539 0x00000000 DCrw------- root system
  16. Semaphores:
  17. s 131072 0x4d02086a --ra-ra---- root system
  18. s 65537 0x00000000 --ra------- root system
  19. s 1310722 0x000133d0 --ra------- 7003 30720

7.4. 清除IPC资源

使用ipcrm 命令来清除IPC资源:这个命令同时会将与ipc对象相关联的数据也一起移除。当然,只有root用户,或者ipc对象的创建者才有这项权利;

ipcrm用法:

  1. ipcrm -M shmkey 移除用shmkey创建的共享内存段
  2. ipcrm -m shmid 移除用shmid标识的共享内存段
  3. ipcrm -Q msgkey 移除用msqkey创建的消息队列
  4. ipcrm -q msqid 移除用msqid标识的消息队列
  5. ipcrm -S semkey 移除用semkey创建的信号
  6. ipcrm -s semid 移除用semid标识的信号

清除当前用户创建的所有的IPC资源:

  1. ipcs -q | awk '{ print "ipcrm -q "$2}' | sh > /dev/null 2>&1;
  2. ipcs -m | awk '{ print "ipcrm -m "$2}' | sh > /dev/null 2>&1;
  3. ipcs -s | awk '{ print "ipcrm -s "$2}' | sh > /dev/null 2>&1;

7.5. 综合应用

查询user1用户环境上是否存在积Queue现象

  • 查询队列Queue:
  1. $ipcs -q
  2.  
  3. ------ Message Queues --------
  4. key msqid owner perms used-bytes messages
  5. 0x49060005 58261504 user1 660 0 0
  6. 0x4f060005 58294273 user1 660 0 0
  7. ...
  • 找出第6列大于0的服务:
  1. $ ipcs -q |grep user1 |awk '{if($5>0) print $0}'
  2. 0x00000000 1071579324 user1 644 1954530 4826
  3. 0x00000000 1071644862 user1 644 1961820 4844
  4. 0x00000000 1071677631 user1 644 1944810 4802
  5. 0x00000000 1071710400 user1 644 1961820 4844