Comment puis-je obtenir un identifiant de processus du parent du processus actuel?
En général, donné un identifiant de processus Comment puis-je obtenir son identifiant de processus parent?
par exemple. Os.gepid () peut être utilisé pour obtenir l'ID de processus et Os.gepppid () pour le parent, comment puis-je obtenir des grands-parents, P>
Ma cible est Linux (Ubuntu) afin que les réponses spécifiques à la plate-forme sont correctes. P>
7 Réponses :
Je ne pense pas que vous puissiez le faire de manière portant dans l'affaire Général. P>
Vous devez obtenir ces informations à partir de la liste de processus (par exemple via la commande ps code>), qui est obtenue de manière spécifique à un système. p>
Ne pense pas qu'il se soucie de la portabilité
spécifique Linux:
Naturellement, cela ne fonctionne pas sous Windows à moins que vous n'ayez Cygwin installé.
Je ne pense pas que vous puissiez faire cela de manière portable Python. Mais il y a deux possibilités.
ps code> afin que vous puissiez analyser cela. li>
- Si vous avez un système avec les systèmes de fichiers code>, vous pouvez ouvrir le fichier
/ proc / / statut code> et rechercher la ligne contenant PPID: code>, puis faites de même pour ce PID. LI>
OL> Par exemple, le script suivant vous obtiendra votre PID, PPID et PPPID, les autorisations disposées aux autorisations: p> xxx pré> produit: p>
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
+1 Bon exemple de travail, mais la réponse de PixelBeat fonctionne facilement, toute mise en garde là-bas?
Non, PixelBeat a l'air bien et, en fait, je l'ai avancé depuis que c'est un peu plus simple que ma méthode - je n'étais pas au courant de ces options à PS, venant de viennent des journées très i> Unix :-)
J'ai édité votre réponse (la ligne PS). L'utilisation de grep pour filtrer la sortie PS peut donner des résultats incorrects (penser si PPPID était 1, par exemple). L'option -p, au fait, est assez ancienne.
Aucun problème, τζζζτζιου, qui était vraiment juste pour montrer que les trois chiffres étaient corrects, ne faisant pas partie de la réponse. Mais je vais utiliser cette option -P à partir de maintenant au lieu de Grep.
Si vous avez une commande "PS" compatible POSIX, ce qui vous permet de spécifier les colonnes que vous voulez, comme ceci:
Vous pouvez alors essayer: P> PS -O PID, PPID CODE>
def listp(pid):
print(pid)
if parent.has_key(pid):
listp( parent[pid] )
line.split () fonctionnera au lieu de re.split (r "\ s +", ligne.strip ()). La division par défaut () se divise sur \ S + et supprime les espaces de tête et de fuite.
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
BTW, j'ai eu des gens qui me demandent souvent pourquoi je ne suis pas suivi de Pep-8 et n'utilise jamais d'espace après un nom lorsque vous l'avez attribuée; C'est une vieille habitude que j'ai développée pour le code C et l'a gardé; Ça fait des années depuis que je me suis fait piquer par un "=" au lieu de "==" bug (ou erreur de syntaxe).
+1 pour pnid, mais ne serait pas récursif "PS -P% D -oppid ="% pid serait beaucoup plus court et clair
Ceci est un script python de processus unique; Je trouve un ps code> plus approprié pour un script shell. Je ne traite pas Python comme remplacement générique / bin / sh. Merci pour le "+1" dans votre commentaire, de toute façon.
En utilisant psutil ( https://github.com/giampaolo/psutil ):
C'est la réponse beaucoup plus fiable, Psutil est une vie de sauvetage.
Il devrait être os.geppid () code> au lieu de
os.gepid () code>. Utilisez
os.gepppid () code> au lieu de
psutil.process (os.gepid ()). PPID () code> (pour retourner 's i> pid). "pour obtenir l'identifiant de grand-parent du processus" i> comme op demande, utilisez
psutil.process (os.geppid ()). PPID () code> (Avis:
getppid () < / code>, pas
getpid () code>).
J'ai regardé cela pour une mission et je n'ai pas trouvé ce que je cherchais, alors je vais poster ici. Je sais que c'est très évident, mais ça m'a complètement ticulé un instant. Si vous êtes celui qui écrit le code du grand-parent, vous pouvez simplement:
#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()); } }
Oui et mieux serait OS.pnid (PID, N) ou Just Os.getppid (PID)