phier now matches processes and PIDs like pgrep.
authorIain Patterson <me@iain.cx>
Wed, 3 Oct 2007 07:32:41 +0000 (07:32 +0000)
committerIain Patterson <me@iain.cx>
Wed, 3 Oct 2007 07:32:41 +0000 (07:32 +0000)
git-svn-id: https://svn.cambridge.iain.cx/profile/trunk@76 6be0d1a5-5cfe-0310-89b6-964be062b18b

phier

diff --git a/phier b/phier
index eaa1b14..cc6387f 100755 (executable)
--- a/phier
+++ b/phier
@@ -4,9 +4,13 @@
 #
 # phier: Show process tree incorporating a process.
 # Notes: phier functions similarly (but not identically) to Solaris ptree.
-# Usage: phier [options] <pid>
+# 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() {
@@ -46,25 +50,43 @@ function find_parent() {
 }
 
 # Parse arguments.
+children=
 top=
-while getopts ":s:" opt; do
+pgrep_opts=
+while getopts ":s:u:x" opt; do
   case $opt in
-    s) top="$1";;
+    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 [options] <pid>"
+  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
 
-parent=$(find_parent "$1" "$top")
-if [ $? = 0 ]; then
-  pstree -ulap $parent
-else
-  exit 1
+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