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

90

Résolu avant de demander: cat /proc/1111/status | grep PPid

Vi.
la source
plus rapide: grep PPid status |cut -f2comme dans time(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); me demande s'il y a quelque chose d'encore plus rapide?
Aquarius Power
1
@AquariusPower Puisque vous demandez, fgrep est plus rapide que grep. fgrep PPid status |cut -f2
jbo5112
sed est bien plus rapide que grep et coupe:sed -rn '/PPid/ s/^.*:\s+// p' < status
Marian

Réponses:

108

Ligne de commande:

ps -o ppid= -p 1111

Une fonction:

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

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

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

Scénario:

#!/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, le PPID du processus en cours est affiché par défaut.

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

Dennis Williamson
la source
Le =signe n'est pas nécessaire, du moins sous OS X 10.8.2.
Jtbandes
5
@jtbandes: le signe égal utilisé ici supprime la sortie de la ligne d'en-tête ( Linux et OS X ).
Dennis Williamson
13

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

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
utilisateur194394
la source
12

Le pid parent est dans la variable shell PPID, donc

echo $PPID
Ivan Novotny
la source
1
Oui, mais 1. Je veux le pid parent d'un autre processus, 2. Je veux pouvoir traverser tous les ancêtres pour commencer.
Vi.
1
Par ailleurs, l’utilisation $PPIDn’a fait que résoudre le problème que Google avait suggéré à cette page de répondre.
Paul Whittaker le
12

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

ps j

Pour le processus simple, il suffit de passer le PID, comme: ps j 1234.

Pour extraire uniquement la valeur, filtrez la sortie awkcomme suit:

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

Kenorb
la source
1
pstreeest le plus beau que j'ai vu ici.
sudo
ps jest génial car il est disponible sur de nombreuses distributions et est facilement composable
Connor McCormick
6

Lisez / proc / $ PID / status. Peut être facilement scripté:

#! / bin / sh
P = 1 $
si [-z "$ P"]; ensuite
    lire P
Fi
cat / proc / "$ P" / status | grep PPid: | grep -o "[0-9] *"
Vi.
la source
2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'c'est tout ce dont vous avez besoin. (Il est très rare que les outils Unix fassent la if [ -z ]; then readchose.)
grawity
@grawity Ça aide de faire des choses commeecho $$ | ppid | ppid | ppid
Vi.
2
UUOC utilisation inutile du chat
Felipe Alvarez
@ FelipeAlvarez, Mes mains ne sont pas habituées à taper < /some/file grep | grep | ....
Vi.
2
Qu'en est-ilgrep /some/file
Felipe Alvarez
4

Sous Linux:

ps hoppid $thatprocess
jill
la source
2
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

Exemple un peu plus complexe qui vérifie la commande d'un parent qui a démarré le processus en cours Modifiez comm = en cmd = pour afficher la commande complète.

sebastian_t
la source
Utilisation inutile d' écho ? ;)
bobbogo
C'est en fait requis sur certains terminaux. Pour être honnête, je ne me souviens pas exactement, mais cela a en fait résolu un problème. : D
sebastian_t
1

Voici une solution rapide qui devrait également fonctionner:

ps $$
Gevork Palyan
la source
Cela ne donne pas le PID parent, ce que l’opérateur a demandé.
Dennis Williamson le
1

Exécuter topavec toutes les options que vous voulez, comme -u username and -p PID.

Et pendant que vous topappuyez sur f, vous obtenez une liste des options que vous souhaitez afficher en topsortie. Les paramètres affichés sont affichés en lettres majuscules et les paramètres affichés ou non en petites lettres.

Donc, en entrant la lettre avant le paramètre, vous pouvez l'activer ou le désactiver. Pour l'ID de processus parent, vous devez entrer bpuis appuyer sur Enter, le PPID s'affichera dans la sortie supérieure.

Praveen S.
la source
1
Il doit être utilisé de manière non interactive. Je sais déjà que dans htopvous pouvez configurer la PPIDcolonne.
Vi.