我正在尝试使用扭曲的spawnProcess启动一个进程,并使用psutil每5秒记录一次资源使用情况。首先,我尝试使用以下代码获取生成的进程的可执行文件名称:
#!/usr/bin/python
from twisted.internet import reactor
from twisted.internet import protocol
import psutil
class MyPP(protocol.ProcessProtocol):
def connectionMade(self):
print "connectionMade!"
process = psutil.Process(self.transport.pid)
print process.pid, process.exe
def outReceived(self, data):
print "out", data,
def errReceived(self, data):
print "error", data,
def processExited(self, reason):
print "processExited"
def processEnded(self, reason):
print "processEnded"
print "quitting"
pp = MyPP()
reactor.spawnProcess(pp, 'cat', ['cat'])
reactor.run()
我希望得到"xxxx/bin/cat",但我得到了以下内容:
connectionMade!
31293 /usr/bin/python2.7
我用ps检查一下,pid是对的,但可执行文件是错误的
ming.dai 31293 0.0 0.0 4328 356 pts/6 S+ 10:30 0:00 cat
有人可以告诉我正确的方法或正确的时间来获取生成过程的可执行文件吗?
多谢!
鉴于
-
psutil
从proc
读取进程信息 spawnProcess
使用os.execvp
将当前进程(python
)替换为新进程(在本例中为cat
)- 您几乎立即请求过程信息
系统似乎没有足够快地使用新的进程信息更新/proc/<pid>
条目。
您可以通过添加一个小延迟来确认这一点:
import time; time.sleep(.1)
print process.pid, process.exe
您将看到预期的输出<pid> /bin/cat
.
如果您不需要立即执行进程,它将按预期工作,否则您需要添加一点延迟,以便系统有时间更新/proc
条目。
与其等待进程生成并确定可执行文件,不如先使用 procutils.which
获取绝对路径,如果您真的想知道二进制映像所在的位置,也许可以调用结果os.path.realpath
。
(正如我在另一个答案的评论中指出的那样,不可能以可移植的通用方式确定子进程何时实际exec
'd。