--- /dev/null
+#!/bin/bash
+#
+# phier: Show process tree incorporating a process.
+# Notes: phier functions similarly (but not identically) to Solaris ptree.
+# Usage: phier [-s <search>] <pid>
+# Usage: phier [-s <search>] [-u <user>] [-x] <process>
+# Options: -s <search> Stop hierarchy at this process name.
+# -u <user> Start search from processes owned by user.
+# -x Match process name exactly.
+# Example: phier -s sshd $$
+# Example: phier -s sshd -u iain nxagent
+#
+
+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)
+
+# echo >&2 "Finding from $child ($top) $pid/$ppid/$cmd"
+
+ if [ -z "$pid" ]; then
+ echo >&2 "Can't find PID $child!"
+ return 1
+ fi
+
+ if [ ! -z "$top" ]; then
+ if [ "$cmd" = "$top" ]; then
+ echo $child
+ return 0
+ fi
+ fi
+
+ if [ $pid = 1 -o $ppid = 1 ]; then
+ echo $pid
+ return 0
+ fi
+
+ find_parent $ppid $top
+ return $?
+}
+
+# Parse arguments.
+children=
+top=
+pgrep_opts=
+while getopts ":s:u:x" opt; do
+ case $opt in
+ s) top="$OPTARG";;
+ u) pgrep_opts="$pgrep_opts -u $OPTARG";;
+ x) pgrep_opts="$pgrep_opts -x"
+ esac
+done
+shift $((OPTIND-1))
+
+if [ $# -lt 1 ]; then
+ echo >&2 "phier: Print process hierarchy for a process."
+ echo >&2 "Usage: phier [-s <search>] <pid>"
+ echo >&2 "Usage: phier [-s <search>] [-u <user>] [-x] <process>"
+ echo >&2 "Options: -s <search> Stop hierarchy at this process name."
+ echo >&2 " -u <user> Start search from processes owned by user."
+ echo >&2 " -x Match process name exactly."
+ echo >&2 "Example: phier -s sshd $$"
+ echo >&2 "Example: phier -s sshd -u iain nxagent"
+ exit 1
+fi
+
+children="$1"; shift
+if ! echo "$children" | grep -qs '^[0-9]*$'; then
+ children=$(pgrep $pgrep_opts "$children")
+fi
+
+errors=0
+for child in $children; do
+ parent=$(find_parent "$child" "$top")
+ if [ $? = 0 ]; then
+ pstree -ulap $parent
+ else
+ errors=$((errors+1))
+ fi
+done
+
+exit $errors