【问题标题】:Python psutil how to find a child processPython psutil如何找到子进程
【发布时间】:2019-11-20 19:48:59
【问题描述】:

鉴于 Linux 上的 PyQt5,我有一个应用程序,它启动一个终端仿真器 (rxvt) 并运行一个命令 (gaurdian),该命令运行另一个程序 (goo)。像这样

medi@medi:~> pstree -p 4610
rxvt(4610)─┬─gaurdian(4612)───goo(4613)
           └─rxvt(4611)

我正在尝试查找“goo”的 pid。所以我继续

    gooPID = 12    # some random value to show my point
    self.process.start(cmd, cmdOpts)
    rxvtPID = self.process.processId()
    try:
         for c in psutil.Process(rxvtPID).children(True):
              print("pid=%d name=%s"  % (c.pid, c.name()))
              if c.name() == 'gaurdian':
                    gooPID = c.pid
     except (psutil.ZombieProcess, psutil.AccessDenied, psutil.NoSuchProcess) as err:
            print(err)
     print("gooPID=%d " % gooPID )

正在显示跟踪日志:

  rxvtPID=4610 name=rxvt  
  gooPID=12

这表明 gooPID 的初始值没有改变。似乎也没有发生孩子的遍历(即我没有看到孩子的孩子等)。 我这样做对吗?

【问题讨论】:

  • 虽然在你的项目中你在问题中使用 pyqt5 是无关紧要的

标签: python python-3.x psutil


【解决方案1】:

我设法通过在 psutil 开始遍历 /proc 文件系统之前插入 sleep(1) 来解决这个问题。那是

209     # ----------------------- getPidByName() ----------------------
210     def getPidByName(self, name):
211         rxvtProc = psutil.Process(self.process.processId() )
212         time.sleep(1)   # else /proc is not ready for read 
213         pid = None 
214         try:
215             for c in rxvtProc.children(True):
216                 # assumption: gaurdian has only one child
217                 if c.name() == name:
218                     return psutil.Process(c.pid).children()[0].pid
219         except psutil.Error as err:
220             print(err)
221         return pid

【讨论】:

  • 这很容易失败。可能是一个睡眠和检查的循环,重复直到找到它,或者超时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2012-08-16
  • 2016-12-08
  • 1970-01-01
相关资源
最近更新 更多