【问题标题】:Get a PID number of a process and than kill it with Python获取进程的 PID 号,然后用 Python 杀死它
【发布时间】:2016-09-17 14:50:42
【问题描述】:

我使用启动 omxplayer 的 Python 代码。它播放歌曲,有时在歌曲播放期间播放广告。在这种情况下,两名球员跑。当 omxplayer 超时时,问题就来了。超时后我无法关闭它,所以到现在我已经使用了

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

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

【问题讨论】:

标签: python linux raspberry-pi


【解决方案1】:

我知道这个问题很老,但这是我提出的,它适用于 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("用户访问") os.kill(int(pid), signal.SIGKILL)

正如@ElTête 提到的那样。

对于不同的进程,您可能需要调整 args 中的返回索引,具体取决于您要杀死的进程。或者只是遍历命令并在找到名称出现的地方终止。这主要是因为“pidof”在 macOS 或 Windows 上不起作用。

【讨论】:

    【解决方案2】:

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

    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()
    

    【讨论】:

    • 由于某种原因,子流程模块对我不起作用。我尝试了模块中的许多命令,几乎所有命令。该程序不会抛出任何错误。我只是没有得到任何答案。我输入的命令表现得好像它不存在一样。
    【解决方案3】:

    我建议使用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
    

    【讨论】:

    • 这似乎是一个不错的解决方案。以及如何获取进程的 pid 而不是终止它?
    • @TiborBalogh 如果您只需要 PID,请使用 pinfo.pid。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2013-06-28
    相关资源
    最近更新 更多