如何获得进程的祖父母身份证

我怎样才能得到当前进程的父进程ID?
一般给一个进程ID我怎么能得到它的父进程ID?
比如os.getpid()可以用来获取父进程的id和os.getppid(),我如何得到祖父母,

我的目标是Linux(Ubuntu的),所以平台的具体答案是好的。

Solutions Collecting From Web of "如何获得进程的祖父母身份证"

特定于linux:

os.popen("ps -p %d -oppid=" % os.getppid()).read().strip() 

通过使用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> >>> 

我不认为你可以用一种可移植的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打开这些文件。

 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 

在一般情况下,我认为你不能这么做。

您需要从进程列表中获取这些信息(例如,通过ps命令),这是以系统特定的方式获取的。

如果你有一个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] )