程式扎記: [ Python 範例代碼 ] 利用 ps 與 grep 找出 processes 並將之 kill

標籤

2013年9月16日 星期一

[ Python 範例代碼 ] 利用 ps 與 grep 找出 processes 並將之 kill

Preface:
底下的範例代碼利用 ps 命令列出所有的 process 後再使用 grep 找出有關鍵字的行數, 最後利用 kill 將這些有關鍵字的 process 刪除.

Sample Code:
首先要在 Python 中執行外部命令, 要使用 subprocess 模組. 底下代碼利用該模組呼叫 "ps -aux" 列出執行中的 process, 接著利用 pipe 執行 "grep" 取出有 "Test.jar" 關鍵字的行數:
>>> import subprocess
>>> from subprocess import Popen
>>> from subprocess import PIPE
>>> p1 = Popen(["ps", "-aux"], stdout=PIPE)
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
>>> p2 = Popen(["grep", "Test.jar"], stdin=p1.stdout, stdout=PIPE)
>>> p1.stdout.close()
>>> output = p2.communicate()[0]
>>> output
'root 23338 0.0 0.0 1261396 10592 pts/1 Sl 19:54 0:00 java -jar Test.jar\nroot 23355 0.0 0.0 1262176 10588 pts/1 Sl 19:55 0:00 java -jar Test.jar\nroot 23372 0.0 0.0 1262184 10588 pts/1 Sl 19:55 0:00 java -jar Test.jar\nroot 23388 0.0 0.0 1262180 10616 pts/1 Sl 19:55 0:00 java -jar Test.jar\nroot 23402 0.0 0.0 1262180 10580 pts/1 Sl 19:55 0:00 java -jar Test.jar\n'

有了這些行數, 接著便是取出該 Process 的 pid 方便後續 kill 使用. 首先某一行可能長成:
root 23338 0.0 0.0 1261396 10592 pts/1 Sl 19:54 0:00 java -jar Test.jar

那個 "23338" 便是該 process 的 pid, 至於每個欄位對應的意義, 可以參考 鳥哥在程序管理一章的說明. 所以第一步便是將 output 切成一行行, 在對每一行取出我們要的 pid:
>>> import re
>>> ptn = re.compile("\s+") # 因為每行的 item 間是以不定長度的空白切割, 故我們使用 "\s+" 來切割每個欄位.
>>> lines = output.strip().split("\n") # 切割 output 成一行行的 list
>>> for line in lines:
... items = ptn.split(line) # 切割欄位
... print("{0}".format(items[1])) # 列印出 pid 欄位
...
23338
23355
23372
23388
23402

有了這些 process 的 pid 接著要刪除它們就易如反掌拉 ^_^. 完整代碼如下:
  1. #!/usr/bin/python  
  2. import subprocess, re  
  3. from subprocess import Popen  
  4. from subprocess import PIPE  
  5.   
  6. keyword = "Test.jar"  # 設置 grep 的關鍵字  
  7. ptn = re.compile("\s+")  
  8.   
  9. p1 = Popen(["ps""-aux"], stdout=PIPE)  
  10. p2 = Popen(["grep", keyword], stdin=p1.stdout, stdout=PIPE)  
  11. p1.stdout.close()  
  12. output = p2.communicate()[0]  
  13. print("Output:\n{0}".format(output))  
  14. lines = output.strip().split("\n")  
  15. for line in lines:  
  16.     items = ptn.split(line)  
  17.     print("kill {0}...".format(items[1], subprocess.call(["kill", items[1]])))  


沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!