Python 如何获得流程';外公外婆证
如何获取当前进程父进程的进程id?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?
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执行相同操作#!/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());
}
}