Как получить идентификатор бабушки и дедушки процесса - PullRequest
7 голосов
/ 13 ноября 2009

Как я могу получить идентификатор процесса родителя текущего процесса?
В общем, учитывая идентификатор процесса, как я могу получить идентификатор родительского процесса?
например os.getpid () можно использовать для получения идентификатора процесса, а os.getppid () для родителя, как мне узнать деда,

Моя цель - linux (ubuntu), поэтому ответы для конкретной платформы в порядке.

Ответы [ 6 ]

22 голосов
/ 20 ноября 2010

Используя psutil (https://github.com/giampaolo/psutil):

>>> import psutil
>>> psutil.Process().ppid()
2335
>>> psutil.Process().parent()
<psutil.Process (pid=2335, name='bash', cmdline='bash') at 140052120886608>
>>> 
7 голосов
/ 13 ноября 2009

для Linux:

os.popen("ps -p %d -oppid=" % os.getppid()).read().strip()
4 голосов
/ 13 ноября 2009

Я не думаю, что вы можете сделать это портативным способом Python. Но есть две возможности.

  1. Информация доступна из команды ps, чтобы вы могли проанализировать ее.
  2. Если у вас есть система с файловыми системами proc, вы можете открыть файл /proc/<pid>/status и найти строку, содержащую PPid:, затем сделать то же самое для этого PID.

Например, следующий скрипт даст вам ваши PID, PPID и PPPID, с разрешениями:

#!/bin/bash
pid=$$
ppid=$(grep PPid: /proc/${pid}/status | awk '{print $2'})
pppid=$(grep PPid: /proc/${ppid}/status | awk '{print $2'})
echo ${pid} ${ppid} ${pppid}
ps -f -p "${pid},${ppid},${pppid}"

производит:

3269 3160 3142
UID        PID  PPID  C STIME TTY          TIME CMD
pax       3142  2786  0 18:24 pts/1    00:00:00 bash
root      3160  3142  0 18:24 pts/1    00:00:00 bash
root      3269  3160  0 18:34 pts/1    00:00:00 /bin/bash ./getem.sh

Очевидно, вам придется открывать эти файлы с помощью Python.

2 голосов
/ 14 ноября 2009
from __future__ import with_statement

def pnid(pid=None, N=1):
    "Get parent (if N==1), grandparent (if N==2), ... of pid (or self if not given)"
    if pid is None:
        pid= "self"

    while N > 0:
        filename= "/proc/%s/status" % pid
        with open(filename, "r") as fp:
            for line in fp:
                if line.startswith("PPid:"):
                    _, _, pid= line.rpartition("\t")
                    pid= pid.rstrip() # drop the '\n' at end
                    break
            else:
                raise RuntimeError, "can't locate PPid line in %r" % filename
        N-= 1

    return int(pid) # let it fail through


>>> pnid()
26558
>>> import os
>>> os.getppid()
26558
>>> pnid(26558)
26556
>>> pnid(N=2)
26556
>>> pnid(N=3)
1
0 голосов
/ 13 ноября 2009

Если у вас есть POSIX-совместимая команда ps, которая позволяет вам указать нужные столбцы, например: ps -o pid,ppid

Вы можете попробовать:

import os
import re

ps = os.popen("ps -o pid,ppid")
ps.readline()    # discard header
lines = ps.readlines()
ps.close

procs = [ re.split("\s+", line.strip()) for line in lines ]

parent = {}
for proc in procs:
    parent[ int(proc[0]) ] = int(proc[1])

Теперь вы можете сделать:

parent[ parent[pid] ]

Вы могли бы даже написать функцию для перечисления предков процесса:

def listp(pid):
    print(pid)
    if parent.has_key(pid):
        listp( parent[pid] )
0 голосов
/ 13 ноября 2009

Я не думаю, что вы можете сделать это переносимо в общем случае.

Вам необходимо получить эту информацию из списка процессов (например, с помощью команды ps), который получается системным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...