7
votes

Comment obtenir le grand-parent de processus

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,

Ma cible est Linux (Ubuntu) afin que les réponses spécifiques à la plate-forme sont correctes.


1 commentaires

Oui et mieux serait OS.pnid (PID, N) ou Just Os.getppid (PID)


7 Réponses :


0
votes

Je ne pense pas que vous puissiez le faire de manière portant dans l'affaire Général.

Vous devez obtenir ces informations à partir de la liste de processus (par exemple via la commande ps ), qui est obtenue de manière spécifique à un système.


1 commentaires

Ne pense pas qu'il se soucie de la portabilité



7
votes

spécifique Linux: xxx


1 commentaires

Naturellement, cela ne fonctionne pas sous Windows à moins que vous n'ayez Cygwin installé.



5
votes

Je ne pense pas que vous puissiez faire cela de manière portable Python. Mais il y a deux possibilités.

  1. Les informations sont disponibles dans la commande ps code> afin que vous puissiez analyser cela. li>
  2. 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
    


4 commentaires

+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 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.



-1
votes

Si vous avez une commande "PS" compatible POSIX, ce qui vous permet de spécifier les colonnes que vous voulez, comme ceci: PS -O PID, PPID CODE>

Vous pouvez alors essayer: P>

def listp(pid):
    print(pid)
    if parent.has_key(pid):
        listp( parent[pid] )


1 commentaires

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.



3
votes
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

3 commentaires

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 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.



24
votes

En utilisant psutil ( https://github.com/giampaolo/psutil ): Xxx


2 commentaires

C'est la réponse beaucoup plus fiable, Psutil est une vie de sauvetage.


Il devrait être os.geppid () au lieu de os.gepid () . Utilisez os.gepppid () au lieu de psutil.process (os.gepid ()). PPID () (pour retourner 's pid). "pour obtenir l'identifiant de grand-parent du processus" comme op demande, utilisez psutil.process (os.geppid ()). PPID () (Avis: getppid () < / code>, pas getpid () ).



0
votes

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());
  }
}


0 commentaires