我正在尝试使用扭曲的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
有人能告诉我正确的方式或正确的时间来获得生成过程的可执行文件吗?
非常感谢!
答案 0 :(得分:2)
鉴于此
psutil
从proc
spawnProcess
使用os.execvp
替换当前流程(python
)与新流程(在本例中为cat
)似乎系统没有使用新的流程信息更快地更新/proc/<pid>
条目。
您可以通过添加一个小延迟来确认:
import time; time.sleep(.1)
print process.pid, process.exe
您将看到预期的输出<pid> /bin/cat
。
如果您不需要立即处理可执行文件,它将按预期工作,否则您需要添加一点延迟以给系统时间更新/proc
条目。
答案 1 :(得分:1)
您可以先使用procutils.which
获取绝对路径,而不是等待您的进程生成并确定可执行文件,如果您真的想知道,可以在结果上调用os.path.realpath
二进制图像存在的地方。
(正如我在其他答案的评论中所指出的那样,以便携式,通用的方式来确定子进程实际上exec
'的时间是不可能的。)