2

我正在尝试使用twisted 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是对的,但是executable是错的

ming.dai 31293  0.0  0.0   4328   356 pts/6    S+   10:30   0:00 cat

有人可以告诉我正确的方法或正确的时间来执行生成过程吗?

非常感谢!

4

2 回答 2

2

鉴于

  • psutil从中读取进程信息proc
  • spawnProcess使用os.execvpwhich 将当前进程 ( python) 替换为新进程 (在本例中cat)
  • 并且您几乎立即要求提供流程信息

似乎系统没有足够快地/proc/<pid>使用新进程信息更新条目。

您可以通过添加一个小延迟来确认这一点:

    import time; time.sleep(.1)
    print process.pid, process.exe

你会看到预期的输出<pid> /bin/cat

如果您不需要立即执行该进程,它将按预期工作,否则您将需要添加一点延迟,以便系统有时间更新/proc条目。

于 2013-09-22T00:54:26.387 回答
1

与其等待进程生成并稍后确定可执行文件,procutils.which不如先获取绝对路径,os.path.realpath如果您真的想知道二进制图像的位置,也许可以调用结果。

(正如我在另一个答案中的评论中指出的那样,不可能以可移植的通用方式确定子流程何时实际exec“d”。)

于 2013-09-22T22:49:04.787 回答