Comment obtenir l'ID de processus parent d'un processus enfant donné?

50

Comment obtenir le pid parent d'un pid donné?

Je sais que je peux vérifier manuellement sous / proc, je me demande s’il existe un moyen intelligent / meilleur d’atteindre cet objectif dans Ubuntu. Notez que le parent peut ou peut ne pas être tué.

Merci

cache
la source

Réponses:

58

Comment obtenir un PID parent (PPID) à partir de l'ID de processus d'un enfant (PID) à l'aide de la ligne de commande

Utilisation ps -o ppid=

  • par exemple, ps -o ppid= 2072return 2061, que vous pouvez facilement utiliser dans un script, etc. ps -o ppid= -C foodonne le PPID du processus avec commande foo. Vous pouvez également utiliser l'ancienne ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Explication plus complète: ps -f 2072retourne
    UID PID   PPID   C TEMPS STAT TEMPS STAT CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helper
    
  • La pstreerelation est pstree -s -p 2072:
    init (1) ulspulseaudio (2061) gconf-helper (2072)
    
ish
la source
Connaissez-vous un moyen de faire des invocations de show pstree (commande + arguments) sans séparer les lignes? Mon installation divise automatiquement les lignes si j'ajoute des arguments, même si le résultat peut facilement tenir sur une ligne. La page de manuel semble en dire autant, mais ne donne pas de raison. Ma solution consiste à extraire les PID de pstree et à utiliser ps -o args ...les résultats, mais cela sent un peu.
John P
Juste quelque chose qui m'a surpris: L'espace après ppid= mais avant le pid semble être nécessaire. J'ai eu des résultats différents si je l'ai omis.
Gregory Arenius
8

En utilisant uniquement une variable pour obtenir le PID parent:

echo $PPID

si vous avez besoin de la commande de ce pid parent:

cat /proc/$PPID/comm

si vous avez besoin de la ligne de commande complète (avec toutes les options):

cat /proc/$PPID/cmdline

Explication

  • $PPID est défini par le shell, c'est le PID du processus parent
  • Dans /proc/, vous avez quelques dirs avec le PID de chaque processus. Ensuite, si vous cat /proc/$PPID/commrenvoyez le nom de la commande du PID

Chèque homme proc

Gilles Quenot
la source
1
C'est la meilleure réponse. procfs est une API de noyau. exécuter une commande et analyser la sortie est un non-sens.
Massimo
Ceci est également potentiellement le plus portable, il PPIDest défini dans le cadre de la norme POSIX, donc tout shell compatible POSIX doit le définir correctement. Voir pubs.opengroup.org/onlinepubs/9699919799/utilities/…
RobV
2

Utiliser pstreepar nom de commande

pstreeVous pouvez utiliser le nom du processus enfant pour obtenir le code de processus (PID), ainsi que les parents, les grands-parents et tous les enfants du processus enfant:

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

Dans ce cas, il sleeps'agit de la commande enfant et de son PID 8414. Son ID parent est 841 et s'appelle display-auto-brightness. Le grand - parent est une coque ( sh) avec un identifiant de processus 839. L'arrière-grand-parent est crondoté d'un ID de processus de 795. L'arrière-arrière-grand-parent est également crondoté d'un ID de processus de 763.

Si vous souhaitez rechercher par ID de processus sleepau lieu de nom, vous pouvez utiliser:

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

Notez que l' sleepID de processus a été remplacé par 14653. Le parent (PID 841) dort pendant 1 minute, se réveille pendant une fraction de seconde, puis lance une nouvelle sleepcommande qui obtient un nouvel ID de processus. C'est une autre raison pour laquelle la recherche sleepest plus facile que la recherche par ID de processus.

Ce code provient de: Ajustez automatiquement la luminosité de l'écran en fonction du lever et du coucher du soleil et est adapté à cette question.


Pour voir une chaîne imbriquée jusqu'au processus de démarrage, utilisez le PID au lieu du nom:

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

Remarque: une minute s'est écoulée et la commande de veille obtient un nouveau PID (8541).

WinEunuuchs2Unix
la source
Dans votre exemple, cette méthode n'aurait pas fonctionné pour le processus cron avec le PID 807.
Olorin
@Olorin Dans les deux exemples, vous pouvez utiliser grep 807ou cronet la même ligne serait réaccordée, ainsi que plus d'enfants si elle était générée. Mais la question était de trouver le parent, pas tous les enfants.
WinEunuuchs2Unix
Exactement - comment trouvez-vous le parent du PID 807 avec cette sortie? Vous ne pouvez pas, car il n'inclut pas le parent de 807.
Olorin
@Olorin Le parent de cron est systemd, qui est PID 1. Je ne pense pas que vous puissiez tuer le PID 1.
WinEunuuchs2Unix
Je n'ai rien dit à propos de tuer quoi que ce soit. Juste pour clarifier, maintenant vous affirmez que prendre la première ligne de pstree ou grepping pour le nom de la commande donnera toujours le PID parent?
Olorin
0

ps -efj peut également être utilisé pour le même.

Par exemple,

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
Obi Wan - PallavJha
la source