我的工具集1——集中刪除系統中的消息隊列

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

本文代碼託管於:
https://github.com/haoranzeus/mytoolkit

發佈了51 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章