2016-09-17 84 views
1

我怎麼能在bash運行命令殺死除腳本所有的Python腳本調用test.py和grep的進程的PID本身,在情況下,我們使用類似ps -ef |grep殺死所有的Python腳本,除了一個python腳本和grep的過程

我認爲我可以使用類似pgrep python來忽略grep進程,但我怎麼也排除test.py腳本?我知道有一個選項做的grep -v,有選擇做pgrep -v

澄清:除了grep的過程 - 是指當我們例如ps -ef |grep test1.py做我們也獲取用於把這個結果grep的PID。我不想殺死它,因爲這個過程不再存在於顯示結果的階段。

編輯: 我需要這個命令,通過Python的subprocess模塊
k = subprocess.Popen('[some_bash_cmd_here]',shell=True)
k.wait()

回答

1

是有效的,您可以使用pgrep -fl python得到匹配python的所有命令,然後把它與awk管道來獲得進程ID通過從命令中排除test.py並最終將其輸入到xargs kill

pgrep -fl python | awk '!/test\.py/{print $1}' | xargs kill 
+0

要獲得的參數在最近'pgrep's並不需要使用' -fa'而不是'-fl'?至少在RHEL 7的情況下,以及最近的Fedora年份也是如此 –

+0

其實我並不瞭解最新的'pgrep',因爲我在OSX上,並且通過'home brew'安裝了另一個'pkill',並且它們都沒有支持'-a' – anubhava

+0

非常感謝,現在我嘗試通過可以運行python腳本的gitlab-ci來啓動這個腳本。 在test.py中,我執行以下代碼: 'k = subprocess.Popen(bash_cmd,shell = True) k.wait()' – JavaSa

1

更好的方法是做過濾在Python本身,在這裏你可以輕鬆地保持狀態等

import subprocess, os 
for proc in subprocess.check_output(['ps', '-ef']).split('\n'): # ps options depend on your OS 
    if 'python' in proc and 'test.py' not in proc: 
     os.kill(proc)