什么时候才能获得由Twisted spawnProcess创建的衍生过程的最终可执行文件?

时间:2013-09-21 17:41:21

标签: 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是对的,但可执行文件是错误的

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

有人能告诉我正确的方式或正确的时间来获得生成过程的可执行文件吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

鉴于此

  • psutilproc
  • 读取流程信息
  • 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'的时间是不可能的。)