我的工具集1——集中删除系统中的消息队列
最近看到一个说法——不做任何超过90秒的工作。这真是偷懒达到一定境界了。不过其实很有道理,程序员嘛,就是要做些东西可以让大家偷懒,解放生产力。而第一个享用着当然应该是自己了。之前也会偶尔写些脚本帮助处理重复性的工作,不过没有什么记录,今天开始,所有写过的小工具要做个记录了。
需求
最近在做消息队列的开发,由于代码还在测试过程中,会在系统中产生好多消息队列。比如这样
zhanghaoran@wlan-ubuntu:~/work/mytoolkit/mytoolkit$ ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000001 163840 zhanghaora 660 0 0
0x0000604c 589825 zhanghaora 660 0 0
0x00005ec3 229378 zhanghaora 660 8 1
0x00005ee1 262147 zhanghaora 660 8 1
0x00005ee8 294916 zhanghaora 660 8 1
0x00005f1c 327685 zhanghaora 660 0 0
0x00005f47 360454 zhanghaora 660 0 0
0x00005f87 393223 zhanghaora 660 0 0
0x00005f88 425992 zhanghaora 660 0 0
0x00005fa9 458761 zhanghaora 660 0 0
0x00005fd0 491530 zhanghaora 660 0 0
0x00005fed 524299 zhanghaora 660 0 0
0x0000601b 557068 zhanghaora 660 0 0
0x00006068 622605 zhanghaora 660 0 0
0x00006084 655374 zhanghaora 660 0 0
0x000060a7 688143 zhanghaora 660 0 0
0x000060c3 720912 zhanghaora 660 0 0
0x000060c5 753681 zhanghaora 660 0 0
0x00006103 786450 zhanghaora 660 0 0
0x0000611f 819219 zhanghaora 660 0 0
0x0000613d 851988 zhanghaora 660 0 0
0x0000615a 884757 zhanghaora 660 0 0
0x0000617e 917526 zhanghaora 660 0 0
0x0000619b 950295 zhanghaora 660 0 0
0x000061bb 983064 zhanghaora 660 0 0
0x000061e2 1015833 zhanghaora 660 0 0
0x00006205 1048602 zhanghaora 660 0 0
0x00006222 1081371 zhanghaora 660 0 0
0x00006241 1114140 zhanghaora 660 0 0
0x00006274 1146909 zhanghaora 660 0 0
0x00006291 1179678 zhanghaora 660 0 0
0x000062d1 1212447 zhanghaora 660 0 0
0x00006442 1245216 zhanghaora 660 0 0
0x00000000 1277985 zhanghaora 660 3 1
0x00006478 1310754 zhanghaora 660 8 1
0x00000000 1343523 zhanghaora 660 3 1
0x00006495 1376292 zhanghaora 660 8 1
0x00000000 1409061 zhanghaora 660 3 1
0x000064b4 1441830 zhanghaora 660 8 1
0x00000000 1474599 zhanghaora 660 3 1
0x000064d4 1507368 zhanghaora 660 8 1
0x00000000 1540137 zhanghaora 660 3 1
0x000064ec 1572906 zhanghaora 660 8 1
0x00000000 1605675 zhanghaora 660 3 1
0x00006522 1638444 zhanghaora 660 0 0
0x00000000 1671213 zhanghaora 660 3 1
0x0000653d 1703982 zhanghaora 660 8 1
0x00000000 1736751 zhanghaora 660 3 1
一条一条手动删除并非上策,那么就要做个小工具集中删除了。
解决方案
当然可以使用shell脚本来解决,不过最近学习Python总是没机会使用,就拿这个练手了。先上代码:
#!/usr/bin/python3
import os
import re
data = os.popen('ipcs -q').read()
lines = re.split('\n', data);
for line in lines:
elements = re.split(' ', line)
if len(elements) >= 2:
if elements[1].isdigit():
os.system('ipcrm -q' + elements[1])
要想删除一个消息队列,使用的方法是ipcrm -q + 消息队列号,也就是要提取出ipcs -q中每行的第二个字段。这样我们需要将ipcs -q的执行结果放到一个变量中方便处理。os.system()不能获得shell的执行结果,但是可以借助os.popen()。这个函数原型为:
os.popen(cmd, mode=’r’, buffering=-1)
它打开一个连接cmd的管道。返回值是这个打开的管道的文件描述符,可以进行读或写操作。这样我们就可以将’ipcs -q’命令的结果读进data变量了。
之后要将变量按行处理,可以通过re.split(),这个函数可以将一个字符串按照指定的模式进行分割,返回作为分割结果的list。
之后遍历这个list,观察’ipcs -q’的结果,我们需要的是第二列为数字的行,所以进行 进一步过滤。最后用得到的ipc号执行’ipcrm -q’即可。