获取pgrep以确定pid一直在运行的长度

时间:2017-10-22 12:57:15

标签: python subprocess

我抄写了一些代码来概述我想要做的事情。我似乎无法使语法正确,有人可以帮忙吗?

def calc_execution():
    import subprocess
    #get the proc id of detectmotion; need help converting into subprocess
    detectmotion_file_pid = subprocess.call(pgrep -f "detectmotion.py")
    if detectmotion_file_pid:
        #determine how long pid has been running; note this seems to be incorrect
        len_run_time=subprocess.call(ps -o etime= -p detectmotion_file_pid)
        print len_run_time

我的问题是让var detectmotion_file_pidlen_run_time的语法正常工作。

有人可以帮忙吗?

由于

1 个答案:

答案 0 :(得分:0)

subprocess.call()期望字符串或字符串数​​组作为args参数 - 请参阅文档here

您正在提供:

subprocess.call(pgrep -f "detectmotion.py"),由python解释为:

  • 获取变量pgrep的值,然后减去f
  • 字符串“detectmotion.py”

你的意思是:

subprocess.call([ 'pgrep',  '-f',  'detectmotion.py'])

该数组中的每个项目都用作下一个进程的参数。 pgrep标识您要运行的二进制文件(并在新进程中显示为arg 0)。 <{1}}和-f是下一个论点。

对于下一个(获取运行时),你再次做同样的事情 - 对以下内容的简单修复。

detectmotion.py

最后一个问题是,您期望subprocess.call(['ps', '-o', 'etime=', '-p', detectmotion_file_pid ]) 的返回值是您所追求的数据。事实上,subprocess.call()将:

  

等待命令完成,然后返回returncode属性。

如果你想捕获刚刚运行的命令的输出,那么你需要使用“ pipe ”,将命令的输出带到你的应用程序中,这是事情变得混乱,文档说:

  

注意:不要将stdout = PIPE或stderr = PIPE与此函数一起使用,因为它可能会基于子进程输出量死锁。当您需要管道时,可以使用subprocess.call() Popen方法。

因此...

communicate()

您需要对x = subprocess.Popen([ 'pgrep', '-f', 'detectmotion.py']) out, _ = x.communicate() # out is currently a string, e.g: '26585\n' print(out) # convert it into an integer: detectmotion_file_pid = int(out.rstrip()) 的输出执行类似的操作,因为这会以人类可读的格式返回您的时间。

ps -o etime= -p ...

此时,您可能会问自己如何将看似x = subprocess.Popen(['ps', '-o', 'etime=', '-p', str(detectmotion_file_pid) ]) out, _ = x.communicate() # out is currently a string, e.g: ' 12:53\n' print(out) # strip it out = out.strip() # now it's free of white-space, e.g: '12:53' print(out) 格式转换为更有用的内容......不幸的是mm:ss的输出是为人类设计的,可能并不是非常直截了当像这样解析。

您可能更愿意查看/proc/[pid]/stat,它可以告诉您有关流程的各种信息: