是否所有进程都在运行

时间:2017-08-15 20:39:53

标签: python subprocess

我正在尝试使用以下CLI命令在python中工作。

pgrep fmserverd fmserver_helperd fmslogtrimmer fmxdbc_listener | wc -l <​​/ p>

返回4告诉我所有4个进程都在运行。这在CLI中工作正常,但在Python中无法正常运行。我只使用命令行中的一个进程执行以下操作:

import subprocess
print subprocess.check_output ([ 'pgrep', 'fmserver_helperd', '|', 'wc', '-l'], shell=True, stderr=subprocess.PIPE)
or
print subprocess.check_output ([ 'pgrep', 'fmserver_helperd', '|', 'wc', '-l'], shell=True)

返回:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 573, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['pgrep', 'fmserver_helperd', '|', 'wc', '-l']' returned non-zero exit status 2

如果我在文件中编写程序,我基本上会得到相同的结果。此代码使用try catch块保护check_output,输出如下所示:

sp.check_output: ['pgrep', 'fmserver_helperd', '|', 'wc', '-l'] ro: True sh: True out: 
usage: pgrep [-Lfilnoqvx] [-d delim] [-F pidfile] [-G gid]
         [-P ppid] [-U uid] [-g pgrp]
         [-t tty] [-u euid] pattern ...
DoSubProcess exception: Command '['pgrep', 'fmserver_helperd', '|', 'wc', '-l']' returned non-zero exit status 2

我真的很坚持这一点,非常感谢你的帮助。 TY

1 个答案:

答案 0 :(得分:3)

如果您想将shell=True与管道一起使用,那么以安全可靠的方式(针对shell注入攻击的证据)执行此操作可能如下所示:

def count_instances(progname):
    return int(subprocess.check_output(['pgrep "$1" | wc -l', '_', progname], shell=True))

请注意,我们将有效的shell脚本作为列表的第一个元素传递。第二个元素是$0到该脚本(我们在其中传递占位符);第三个是$1

然而,当你可以运行时,这并不是特别好的做法:

def count_instances(progname):
    return subprocess.check_output(['pgrep', progname]).count('\n')

......根本不需要shell=True