我的工具集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’即可。