run-in-pagsh improvements
[clinton/scripts.git] / run-in-pagsh
index 80176f4..a8bcef8 100755 (executable)
@@ -1,34 +1,54 @@
 #!/usr/bin/pagsh.openafs
 #!/usr/bin/pagsh.openafs
+# -*- Shell-Script -*-
 #
 # Usage:
 #
 #
 # Usage:
 #
-#    NAME=name run-in-pagsh command arguments ...
+#    run-in-pagsh [--fg] name command [argument ...]
 #
 #
-# Example:
+# The argument `name' is a short description of the program to call,
+# without any spaces.  It is used for making a PID file, which ensures
+# that only one instance of your command is running.
 #
 #
-#    NAME=interchange run-in-pagsh ~/interchange/bin/interchange
+# The arguments that come afterward specify the command to run and its
+# arguments, if any.
+#
+# If the command will run in the foreground, then you should use the
+# `--fg' argument, making sure that it is the very first argument to
+# run-in-pagsh.
+#
+# Examples:
+#
+#    run-in-pagsh interchange ~/interchange/bin/interchange
+#
+#    run-in-pagsh --fg clean-mail ~/scripts/clean-mail
 #
 # Make sure that the ~/.run directory exists and is writable.
 # See http://wiki2.hcoop.net/MemberManual/RunningUnattendedCommands
 # for instructions on how to accomplish this.
 
 #
 # Make sure that the ~/.run directory exists and is writable.
 # See http://wiki2.hcoop.net/MemberManual/RunningUnattendedCommands
 # for instructions on how to accomplish this.
 
-# Sanity checks
-if test -z "$NAME"; then
-    echo "Error: you must set the NAME environment variable before" \
-        "running this script."
-    exit 1
-elif test -z "$1"; then
-    echo "Error: you must provide the command to run and its arguments."
+# Allow user to specify "--fg" argument.
+if test "$1" = "--fg"; then
+    shift
+    BGFLAG=
+else
+    BGFLAG=-b
+fi
+
+# Sanity checks.
+if test -z "$2"; then
+    echo "Error: not enough arguments."
+    echo "Usage: run-in-pagsh name [--fg] command [argument ...]"
     exit 1
     exit 1
-elif test ! -d "~/.run"; then
+elif test ! -d "$HOME/.run"; then
     echo "Error: the ~/.run directory must exist before running this script."
     exit 1
 fi
 
 # Use a different PID file for each program.
     echo "Error: the ~/.run directory must exist before running this script."
     exit 1
 fi
 
 # Use a different PID file for each program.
-K5PID=~/.run/${NAME}.pid
+K5PID=$HOME/.run/$1.pid
 
 # The command to run.
 
 # The command to run.
+shift
 CMD="$*"
 
 # Your keytab file.
 CMD="$*"
 
 # Your keytab file.
@@ -36,12 +56,23 @@ KTAB=/etc/keytabs/user.daemon/$USER
 
 # Terminate current k5start process, if one is running.
 if test -f "$K5PID"; then
 
 # Terminate current k5start process, if one is running.
 if test -f "$K5PID"; then
-    kill `cat -- "$K5PID"`
-    rm -f "$K5PID"
+    kill `cat -- "$K5PID"` 2>/dev/null
+    /usr/bin/k5start -qtU -f "$KTAB" -- rm -f "$K5PID"
 fi
 
 fi
 
-# Start fresh k5start daemon which will be refreshing tickets every 540 min
-/usr/bin/k5start -U -b -K 540 -t -p "$K5PID" -f "$KTAB"
+if test -n "$BGFLAG"; then
+
+    # Start fresh k5start daemon which will be refreshing tickets
+    # every 540 min.
+    /usr/bin/k5start -U -b -K 540 -t -p "$K5PID" -f "$KTAB"
+
+    # Run actual service with arguments as provided on command line.
+    $CMD
 
 
-# Run actual service with arguments as provided on command line
-$CMD
+else
+
+    # Run the command once, in the foreground, cleaning up its PID
+    # file when done.
+    /usr/bin/k5start -U -K 540 -t -p "$K5PID" -f "$KTAB" -- $CMD
+    /usr/bin/k5start -qtU -f "$KTAB" -- rm -f "$K5PID"
+fi