在python中按命令杀死进程

时间:2014-07-05 15:12:40

标签: python linux subprocess

我试图避免像这样杀死这个过程:

import subprocess
command = "pkill python"
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)

但我试图杀死一个特定的进程,而不是所有的python进程。假设进程命令被调用" python test.py"我想杀死那个,并保持其他python进程完好无损。不确定我会怎么做。

平台是Linux / Ubuntu

澄清一下,当我执行ps -aux时,这就是我想要完成的事情grep" python"我明白这一点:

sshum    12115 68.6  2.7 142036 13604 pts/0    R    11:11   0:13 python test.py &
sshum    12128  0.0  0.1  11744   904 pts/0    S+   11:12   0:00 grep --color=auto test.py

我想杀死进程12115,但是我不确定如何在不同时杀死所有其他python进程的情况下执行此操作。

编辑: 这是我提出的解决方案,但它看起来并不特别优雅......

command = "ps aux"
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output = process.communicate()[0].split("\n")
try:
    for p in output:
        if "python test.py" in p:
            l = p.split(" ")
            l = [x for x in l if x!='']
            pid = int(l[1])
            os.kill(pid, 9)
except:
    pass

1 个答案:

答案 0 :(得分:1)

pgrep(-f)中有一个标志,允许在整个命令行中搜索进程,而不仅仅是名称。

尝试重现结果时,在我的计算机上输出ps aux|grep python

shadowk+  1194  2.4  0.5 354240 70748 ?        S    11:29   0:46 /usr/bin/python /usr/share/chronoslnx/main.py
shadowk+  1239  0.1  0.6 508548 84080 ?        Sl   11:29   0:03 /usr/bin/python2 /usr/share/kupfer/kupfer.py
shadowk+  1245  0.0  0.4 296732 60956 ?        S    11:29   0:00 /usr/bin/python2 -O /usr/share/wicd/gtk/wicd-client.py --tray
shadowk+  2279 99.7  0.0  22800  7372 pts/3    R+   12:00   0:30 /usr/bin/python ./test.py
shadowk+  2289  0.0  0.0  10952  2332 pts/0    S+   12:01   0:00 grep --color=auto python

在我的情况下,这些命令中的任何一个都会得到正在运行的./test py文件的PID:

pgrep -f 'python ./test.py'
pgrep -f 'test.py'

第二个更接近你正在寻找的东西,所以调整后的代码看起来像这样(对于Python 2.x,你只需要从e.output中删除.decode()调用并调用get PID):

import subprocess
import os
try:
    needed_pid=subprocess.check_output(['pgrep','-f','test.py']).decode()
except subprocess.CalledProcessError as e:
    print("pgrep failed because ({}):".format(e.returncode) , e.output.decode())
else:
    try:
        os.kill(int(needed_pid), 9)
        print("We killed test.py!")
    except ProcessLookupError as e:
        print("We tried to kill an old entry.")
    except ValueError as e:
        print("Well, there's no test.py...so...yeah.")

如果你想直接调用pkill做同样的事情,你也可以更简单地这样做:

import subprocess
subprocess.call(['pkill', '-f', 'test.py'])