2010-06-08 09:42:29 +0000 2010-06-08 09:42:29 +0000
94
94

Comment obtenir le PID parent d'un processus donné dans GNU/Linux à partir de la ligne de commande ?

Résolu avant la question : cat /proc/1111/status | grep PPid

Réponses (10)

112
112
112
2010-06-08 11:21:06 +0000

Ligne de commande :

ps -o ppid= -p 1111

Fonction :

ppid () { ps -p ${1:-$$} -o ppid=; }

Alias (une fonction est préférable ) :

alias ppid='ps -o ppid= -p'

Script :

#!/bin/sh
pid=$1
if [-z $pid]
then
    read -p "PID: " pid
fi
ps -p ${pid:-$$} -o ppid=

Si aucun PID n'est fourni à la fonction ou au script, ils affichent par défaut le PPID du processus en cours.

Pour utiliser l'alias, un PID doit être fourni.

15
15
15
2013-01-31 20:32:13 +0000

C'est une de ces choses que j'apprends, oublie, réapprend, répète. Mais c'est utile. Le drapeau ‘s’ de la commande pstree montre un arbre avec une feuille à N :

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
13
13
13
2012-09-24 11:55:28 +0000

Le pid des parents est dans la variable shell PPID, donc

echo $PPID
12
12
12
2016-02-19 21:31:34 +0000

Pour imprimer les identifiants parents (PPID) de tous les processus, utilisez cette commande :

ps j

Pour le processus unique, passez simplement le PID, comme : ps j 1234. Pour extraire uniquement la valeur, filtrez la sortie par awk, comme :

ps j | awk 'NR>1 {print $3}' # BSD ps
ps j | awk 'NR>1 {print $1}' # GNU ps

Pour lister les PID de tous les parents, utilisez pstree (installez le si vous ne l'avez pas) :

$ pstree -sg 1234
systemd(1)───sshd(1036)───bash(2383)───pstree(3007)

Pour obtenir le PID parent du processus en cours, utilisez echo $$.

6
6
6
2010-06-08 09:44:05 +0000

Lire /proc/$PID/statut. Peut être facilement scripté :

#!/bin/sh P=$1 if [-z "$P"]; then read P fi cat /proc/"$P"/status | grep PPid: | grep -o "[0-9]\*"
4
4
4
2014-10-21 17:30:05 +0000

Sur Linux :

ps hoppid $thatprocess
2
2
2
2014-10-19 20:08:11 +0000
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

Un exemple un peu plus complexe qui vérifie la commande d'un parent ayant lancé le processus en cours Change comm= to cmd= to see full command

1
1
1
2012-11-23 12:21:12 +0000

Exécutez top avec les options que vous voulez, comme -u username and -p PID.

Et pendant que top fonctionne, appuyez sur f, il affiche une liste d'options que vous voulez afficher dans la sortie de top, et les paramètres affichés seront affichés en lettres capitales et les paramètres qui s'affichent ou non seront affichés en lettres minuscules.

Ainsi, en entrant la lettre précédant le paramètre, vous pouvez l'activer ou le désactiver. Pour l'ID du processus parent, vous devez entrer b et ensuite appuyer sur Entrée, cela affichera le PPID en sortie supérieure.

1
1
1
2013-09-12 06:18:04 +0000

Voici une solution rapide qui devrait également fonctionner :

ps $$
0
0
0
2019-10-30 21:51:11 +0000

all parent processes of a pid

Je suis venu ici quand j'essayais de trouver “all parent processes of a pid”. J'ai fini par créer ma propre fonction récursive pour le faire.

pid_lineage.sh

#!/bin/bash -eu

main(){
  ps -p ${1:-$$} -h -o pid,ppid,args | \
    (
      read pid ppid args
      echo -e "$pid\t$args"
      [[$pid -gt 1]] && main $ppid
    )
}

main "$@"

Questions connexes

6
10
10
7
27