检查进程是否在Python中运行(在Linux/Unix中)

sha*_*ash 37 python linux

我试图找出进程是否基于进程ID运行.根据论坛上的帖子之一,代码如下.我不能考虑进程名称,因为有多个进程使用相同的名称运行.

def findProcess( processId ):
    ps= subprocess.Popen("ps -ef | grep "+processId, shell=True, stdout=subprocess.PIPE)
    output = ps.stdout.read()
    ps.stdout.close()
    ps.wait()
    return output
def isProcessRunning( processId):
    output = findProcess( processId )
    if re.search(processId, output) is None:
        return true
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

输出:

1111 72312 72311   0   0:00.00 ttys000    0:00.00 /bin/sh -c ps -ef | grep 71676
1111 72314 72312   0   0:00.00 ttys000    0:00.00 grep 71676
Run Code Online (Sandbox Code Playgroud)

它总是返回true,因为它可以在输出字符串中找到进程id.

有什么建议?谢谢你的帮助.

use*_*876 41

尝试:

os.kill(pid, 0)
Run Code Online (Sandbox Code Playgroud)

如果进程存在,则应该成功(并且不执行任何操作),或者如果进程不存在则抛出异常(可以捕获).

  • 不,它实际上不会杀死这个过程.`kill`是一个命名不好的系统调用. (8认同)
  • 它会杀死进程吗? (4认同)

dic*_*ato 10

我认为最简单的答案(albiet可能并不理想),就是改变你的想法

ps -ef | grep <pid>
Run Code Online (Sandbox Code Playgroud)

至:

ps -ef | grep <pid> | grep -v grep
Run Code Online (Sandbox Code Playgroud)

这将忽略包含您要查找的进程的PID的grep搜索的进程列表.

看来user9876的答案更像是"pythonic".


Min*_*Shi 9

您可以检查文件夹/ p​​roc/[process_id]是否存在.

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True
Run Code Online (Sandbox Code Playgroud)

请参阅此SO:如果进程仍在运行,如何使用Python检查Linux?


Cod*_*ess 8

这有点像kludge,但在*nix上你可以使用os.getpgid(pid)os.kill(pid,sig)来测试进程ID的存在.

import os

def is_process_running(process_id):
    try:
        os.kill(process_id, 0)
        return True
    except OSError:
        return False
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,os.kill适用于Windows(从Python 2.7开始),而os.getpgid 不是. Windows版本调用TerminateProcess(),它将"无条件地导致进程退出",所以我预测它不会安全地返回您想要的信息而不实际杀死进程(如果存在的话).

如果您使用的是Windows,请告诉我们,因为在这种情况下,这些解决方案都不可接受.


sad*_*ave 7

我知道这已经过时了,但我已经习惯了它,它似乎有用了; 您可以快速调整以从进程名称转换为进程ID:

 try:
    if len( os.popen( "ps -aef | grep -i 'myprocess' | grep -v 'grep' | awk '{ print $3 }'" ).read().strip().split( '\n' ) ) > 1:
        raise SystemExit(0)
 except Exception, e:
        raise e
Run Code Online (Sandbox Code Playgroud)


rpl*_*lnt 5

如果您不介意使用外部模块,我建议使用psutil.它是跨平台的,比产生子shell更容易使用,仅用于查找正在运行的进程.