我正在使用子进程模块来查找进程是否正在运行.但是当不存在查找过程时,结果会有所不同.
例如,在外壳中,如果不存在进程python test.py,则ps -ef | grep python | grep test | awk'{print $2}’的输出为空.但是在python中:
cmd="ps -ef|grep python|grep test|awk '{print $2}'"
vp=subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
r=vp.communicate()[0]
输出r不是None.它是执行cmd的shell的pid.
那么如何获得理想的结果呢?
解决方法:
在shell子进程运行时,ps可以看到其参数,因为它们是作为命令行传递给sh的.
shell = True通过调用[‘/ bin / sh’,’-c’,cmdstring]起作用.
在外壳程序中键入管道时,管道的每个部分都会分别调用,因此不会在参数中同时包含“ python”和“ test”的进程.
您的流程树如下所示:
python script.py
/bin/sh -c "ps -ef|grep python|grep test|awk '{print $2}'"
ps -ef
grep python
grep test
awk '{print $2}'