子进程PID与ps输出不同
为什么通过 Popen.pid
获取的子进程 ID 和用 ps
命令看到的值不一样呢?
我注意到这个问题,当我在 Python 里面用 subprocess.call()
调用 ps
,或者在另一个终端里运行 ps
时,结果会不同。
这里有一个简单的 Python 文件可以用来测试:
#!/usr/bin/python3
'''
Test subprocess termination
'''
import subprocess
command = 'cat'
#keep pipes so that cat doesn't complain
proc = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
shell=True)
print('pid = %d' % proc.pid)
subprocess.call("ps -A | grep -w %s" % command,
shell=True)
proc.terminate()
proc.wait() # make sure its dead before exiting pytyhon
通常情况下,ps
返回的进程 ID 会比 Popen.pid
报告的值多 1 或 2。
1 个回答
5
因为这个命令是用 shell=True
这个选项运行的,所以返回的进程ID(pid)是用来执行这个命令的那个壳程序的进程ID。