繁体   English   中英

获取进程的PID号,然后使用Python将其杀死

[英]Get a PID number of a process and than kill it with Python

我使用启动omxplayer的Python代码。 它会播放歌曲,有时还会在歌曲播放过程中播放广告。 在这种情况下,有两名选手奔跑。 当omxplayer超时时,问题就来了。 超时后我无法关闭它,所以直到现在我已经习惯了

os.system("killall -9 omxplayer.bin")

仅播放一首歌曲就可以,但是在一首歌曲中结束广告并且omxplayer超时(不知道为什么,但是超时经常发生)时,此命令将杀死这两个omxplayer。 因此,如果我可以获取进程的PID(omxplayer.bin)并将其存储在python中的变量中并使用它杀死进程,那将是很好的。 但是我很感激任何可以返回给定进程的PID并从python代码中杀死它的解决方案。 到目前为止,我尝试了很多事情。 有人可以帮助我吗?

我建议使用psutil ,特别是psutil.process_iter()

>>> # get all PIDs
>>> psutil.pids()
[0, 4, 472, 648, 756, ...]
>>> # but for iteration you should use process_iter()
>>> for proc in psutil.process_iter():
>>>     try:
>>>         if pinfo.name() == "omxplayer":
>>>             pinfo.terminate()
>>>     except psutil.NoSuchProcess:
>>>         pass

正如我评论的那样,一个可能的解决方案:

import os
import signal
from subprocess import check_output

def get_pid(name):
    return check_output(["pidof", name])

def main():
    os.kill(get_pid(whatever_you_search), signal.SIGTERM) #or signal.SIGKILL 

if __name__ == "__main__":
    main()

我知道这个问题很旧,但是这是我想出来的,它适用于Java过程:

首先获取pid

def getPidByName(name):
    process = check_output(["ps", "-fea"]).split('\n')
    for x in range(0, len(process)):
        args = process[x].split(' ')
        for j in range(0, len(args)):
            part = args[j]
            if(name in part):
                return args[2]

然后杀死它pid = getPidByName(“ user-access”)os.kill(int(pid),signal.SIGKILL)

就像@ElTête提到的那样。

对于不同的进程,您可能必须根据要杀死的进程来调整args中的返回索引。 或者只是遍历命令并杀死在其中找到该名称的位置。 这主要是因为“ pidof”在macO或Windows上不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM