简体   繁体   中英

Python psutil how to find a child process

Given PyQt5 on Linux, I have an application that starts a terminal emulator (rxvt) and runs a command (gaurdian) which runs yet another program (goo). Like this

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

I am trying to find pid of "goo". So I proceed with

    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 )

The trace log is showing:

  rxvtPID=4610 name=rxvt  
  gooPID=12

which suggests that the initial value of gooPID was not changed. Also seems like traversal of children is not happening (ie I am not seeing children of children, etc). Am I doing this right?

I managed to solve this by inserting a sleep(1) before psutil begins to traverse the /proc filesystem. That is

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM