113

Resolved before asked: cat /proc/1111/status | grep PPid

4
  • faster: grep PPid status |cut -f2 like in time(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); wonder if there is something even faster? Aug 9 '14 at 23:55
  • 1
    @AquariusPower Since you ask, fgrep is faster than grep. fgrep PPid status |cut -f2
    – jbo5112
    Feb 18 '16 at 22:46
  • sed is way faster than grep and cut: sed -rn '/PPid/ s/^.*:\s+// p' < status
    – Marian
    Apr 25 '17 at 23:15
  • pid=3773234; while true; do pid=$(awk '/^PPid:/{print $NF}' /proc/$pid/status);printf "$pid\n"; if [ $pid -eq 1 ];then break;fi;done|tac
    – P....
    Jun 19 at 4:53

10 Answers 10

127

Command line:

ps -o ppid= -p 1111

Function:

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

Alias (a function is preferable):

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=

If no PID is supplied to the function or the script, they default to show the PPID of the current process.

To use the alias, a PID must be supplied.

3
  • 1
    The = sign is not necessary, at least on OS X 10.8.2.
    – jtbandes
    Jan 9 '13 at 19:04
  • 7
    @jtbandes: The equal sign as used here suppresses the output of the header line (Linux and OS X). Jan 9 '13 at 21:08
  • prefer alias if you want any shell auto-complete to still work
    – smac89
    Dec 7 '20 at 23:59
19

To print parent ids (PPID) of all the processes, use this command:

ps j

For the single process, just pass the PID, like: ps j 1234.

To extract only the value, filter output by awk, like:

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

To list PIDs of all parents, use pstree (install it if you don't have it):

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

To get parent PID of the current process, use echo $$.

2
  • 1
    pstree is the nicest one I've seen here.
    – sudo
    Sep 8 '17 at 0:33
  • ps j is great because it's available on many distros and is easily composable Jul 22 '19 at 20:58
15

This is one of those things I learn, forget, relearn, repeat. But it's useful. The pstree command's ‘s’ flag shows a tree with a leaf at N:

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
2
  • What about ps f?
    – Alex78191
    Apr 3 '20 at 18:32
  • @Alex78191 why do you ask? What about it? It does something completely different to what the question asked.
    – nyov
    May 26 '20 at 13:28
13

Parent pid is in shell variable PPID, so

echo $PPID
2
  • 2
    Yes, but 1. I want parent pid of other process, 2. I want to be able to traverse all ancestors to init.
    – Vi.
    Sep 24 '12 at 12:37
  • 2
    On the other hand, using $PPID did just solve the problem I had which Google suggested this page as an answer to. Sep 24 '12 at 15:58
8

Read /proc/$PID/status. Can be easily scripted:

#!/bin/sh
P=$1
if [ -z "$P" ]; then
    read P
fi
cat /proc/"$P"/status | grep PPid: | grep -o "[0-9]*"
6
  • 3
    grep '^PPid:' /proc/$1/status | grep -o '[0-9]*' is all you need. (It is very uncommon for Unix tools to do the if [ -z ]; then read thing.)
    – user1686
    Jun 8 '10 at 11:12
  • @grawity It helps do do things like echo $$ | ppid | ppid | ppid
    – Vi.
    Jun 9 '10 at 13:04
  • 2
    UUOC useless use of cat Nov 25 '14 at 0:26
  • @FelipeAlvarez, My hands are not used to type < /some/file grep | grep | ....
    – Vi.
    Nov 25 '14 at 0:29
  • 2
    What about grep /some/file Nov 25 '14 at 0:35
5

On Linux:

ps hoppid $thatprocess
3
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

A little bit more complex example that checks the command of a parent that started current process Change comm= to cmd= to see full command

2
  • Useless use of echo? ;)
    – bobbogo
    Oct 12 '17 at 10:21
  • It is actually required on some terminals. To be honest I don't remember exactly but it actually solved a problem. :D Oct 13 '17 at 7:08
2

Run top with whatever options you want, like -u username and -p PID.

And while top is working press f, it shows a list of options you want to display in top output, and the displayed parameters will be shown in CAPITAL letters and the parameters which or not displaying will be shown in small letters.

So by entering the letter before the parameter you can enable or disable it. For parent process ID you have to enter b and then press Enter, it'll display the PPID in top output.

1
  • 1
    It is to be used non-interactively. I already know that in htop you can configure PPID column.
    – Vi.
    Nov 23 '12 at 13:49
1

Here is a quick solution that should also work:

ps $$
1
  • That doesn't give the parent PID which is what the OP asked for. Sep 24 '13 at 19:35
1

all parent processes of a pid

I came here when I was trying to find "all parent processes of a pid". I ended up making my own recursive function to do it.

pid_lineage.sh

#!/bin/bash -eu

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

main "$@"
1
  • @John-Karahalis I appreciate your edit. It was rejected by 2 other reviewers, but I agree and usually use long options to save readers time having to look up the meaning of cryptic flags. Thanks! Aug 30 at 21:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.