#!/bin/bash
+#
+# $Id$
+#
+# phier: Show process tree incorporating a process.
+# Notes: phier functions similarly (but not identically) to Solaris ptree.
+# Usage: phier [options] <pid>
+# Options: -s <search> Stop hierarchy at this process name.
+# Example: phier -s sshd $$
+#
function find_parent() {
child="$1"; shift
top="$1"; shift
+ if [ -z "$child" ]; then
+ echo >&2 "No child to find."
+ return 1
+ fi
+
cmd=$(ps -o comm= -p $child)
pid=$(ps -o pid= -p $child)
ppid=$(ps -o ppid= -p $child)
fi
fi
- if [ $ppid = 1 ]; then
+ if [ $pid = 1 -o $ppid = 1 ]; then
echo $pid
return 0
fi
return $?
}
+# Parse arguments.
+top=
+while getopts ":s:" opt; do
+ case $opt in
+ s) top="$1";;
+ esac
+done
+shift $((OPTIND-1))
+
if [ $# -lt 1 ]; then
echo >&2 "phier: Print process hierarchy for a process."
- echo >&2 "Usage: phier <pid> [<search>]"
- echo >&2 "Notes: If a search term is given the hierarchy will stop after finding a"
- echo >&2 " process matching that search term."
- echo >&2 "Example: phier $$ sshd"
+ echo >&2 "Usage: phier [options] <pid>"
+ echo >&2 "Options: -s <search> Stop hierarchy at this process name."
+ echo >&2 "Example: phier -s sshd $$"
exit 1
fi
-parent=$(find_parent ${1+"$@"})
+parent=$(find_parent "$1" "$top")
if [ $? = 0 ]; then
pstree -ulap $parent
else