Python 如何获得流程';外公外婆证

Python 如何获得流程';外公外婆证,python,linux,process,subprocess,Python,Linux,Process,Subprocess,如何获取当前进程父进程的进程id? 通常,给定一个进程id,如何获取其父进程id? e、 g.os.getpid()可以用于获取进程id,而os.getppid()对于父级,如何获取祖父母 我的目标是linux(ubuntu),因此特定于平台的答案是可以的。我认为在一般情况下,您无法通过便携方式实现这一点 您需要从进程列表(例如通过ps命令)中获取此信息,该列表是以特定于系统的方式获取的。特定于linux的: os.popen("ps -p %d -oppid=" % os.getppid())

如何获取当前进程父进程的进程id?
通常,给定一个进程id,如何获取其父进程id?
e、 g.os.getpid()可以用于获取进程id,而os.getppid()对于父级,如何获取祖父母


我的目标是linux(ubuntu),因此特定于平台的答案是可以的。

我认为在一般情况下,您无法通过便携方式实现这一点

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

特定于linux的:

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

我不认为您可以用可移植的Python方式来实现这一点。但有两种可能性

  • 该信息可从
    ps
    命令获得,因此您可以对其进行分析
  • 如果系统具有
    proc
    文件系统,则可以打开文件
    /proc//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打开这些文件。

    如果您有符合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] )
    
    通过使用psutil():

    导入psutil >>>psutil.Process().ppid() 2335 >>>psutil.Process().parent() >>>
    我在这里查找作业,但没有找到我要找的内容,因此我将在这里发布。我知道这是很明显的,但它让我一时困惑。如果您是编写祖父母代码的人,您可以:

    #include <stdio.h>
    #include <sys/types.h>
    #include<sys/wait.h>
    #include <unistd.h>
    
    int main(void) {
      int grandpa = getpid();
      int id = fork();
      if (id == 0) {
        int id2 = fork();
        if (id2 == 0) {
          printf("I am the child process C and my pid is %d. My parent P has pid %d. My grandparent G has pid %d.\n", getpid(), getppid(), grandpa);
        } else {
          wait(NULL);
          printf("I am the parent process P and my pid is %d. My parent G has pid %d.\n", getpid(), getppid());
        }
      } else {
        wait(NULL);
        printf("I am the grandparent process G and my pid is %d.\n", getpid());
      }
    }
    
    #包括
    #包括
    #包括
    #包括
    内部主(空){
    int=getpid();
    int id=fork();
    如果(id==0){
    int id2=fork();
    如果(id2==0){
    printf(“我是子进程C,我的pid是%d。我的父进程P有pid%d。我的祖父母G有pid%d。\n”,getpid(),getppid(),Grandgon);
    }否则{
    等待(空);
    printf(“我是父进程P,我的pid是%d。我的父进程G有pid%d。\n”,getpid(),getppid());
    }
    }否则{
    等待(空);
    printf(“我是祖辈进程G,我的pid是%d。\n”,getpid());
    }
    }
    
    当然,除非你安装了cygwin,否则这在windows上不起作用。是的,最好是os.pnid(pid,N)或os.getppid(pid)+1,这是一个很好的工作示例,但pixelbeat的答案很容易,有什么警告吗?没有,pixelbeat看起来不错,事实上,我对它投了更高的票,因为它比我的方法简单一点——我不知道ps的这些选项,它们来自于UNIX的早期:-)我编辑了你的答案(ps行)。使用grep过滤ps输出可能会给出错误的结果(例如,假设pppid为1)。顺便说一句,-p选项已经很老了。没有问题,那只是为了表明这三个数字是正确的,而不是答案的一部分。但从现在起,我将使用-p选项代替grep.line.split()而不是re.split(r“\s+”,line.strip())。默认的split()在\s+上拆分,并删除前导和尾随空格。顺便说一句,我经常有人问我为什么不遵循PEP-8,并且在分配给它时从不在名称后使用空格;这是我为C代码开发并保持的一个老习惯;自从我上次被“=”而不是“==”错误(或语法错误)咬到已经有好几年了。pnid为+1,但递归的“ps-p%d-oppid=“%pid”不会更短更清晰这是一个单进程python脚本;我发现递归
    ps
    更适合shell脚本。我不会将python视为通用的/bin/sh替代品。无论如何,谢谢你评论中的“+1”。不要认为他关心可移植性这是更可靠的答案,psutil是一个救星。它应该是
    os.getppid()
    而不是
    os.getpid()
    。使用
    os.getppid()
    而不是
    psutil.Process(os.getpid()).ppid()
    (返回父进程的pid)。按照OP的要求,“要获取进程的祖父母id”,请使用
    psutil.process(os.getppid()).ppid()
    (注意:
    getppid()
    ,而不是
    getpid()
    )。
    >>> import psutil
    >>> psutil.Process().ppid()
    2335
    >>> psutil.Process().parent()
    <psutil.Process (pid=2335, name='bash', cmdline='bash') at 140052120886608>
    >>> 
    
    #include <stdio.h>
    #include <sys/types.h>
    #include<sys/wait.h>
    #include <unistd.h>
    
    int main(void) {
      int grandpa = getpid();
      int id = fork();
      if (id == 0) {
        int id2 = fork();
        if (id2 == 0) {
          printf("I am the child process C and my pid is %d. My parent P has pid %d. My grandparent G has pid %d.\n", getpid(), getppid(), grandpa);
        } else {
          wait(NULL);
          printf("I am the parent process P and my pid is %d. My parent G has pid %d.\n", getpid(), getppid());
        }
      } else {
        wait(NULL);
        printf("I am the grandparent process G and my pid is %d.\n", getpid());
      }
    }