You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by sa...@apache.org on 2013/04/26 00:01:45 UTC

svn commit: r1475983 - /jena/trunk/jena-fuseki/fuseki

Author: sallen
Date: Thu Apr 25 22:01:45 2013
New Revision: 1475983

URL: http://svn.apache.org/r1475983
Log:
JENA-442 Update Fuseki server script: 
1) Allow config file to be specified 
2) Run as a different user 
3) Add support for start-stop-daemon (daemontools)

Modified:
    jena/trunk/jena-fuseki/fuseki

Modified: jena/trunk/jena-fuseki/fuseki
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/fuseki?rev=1475983&r1=1475982&r2=1475983&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/fuseki (original)
+++ jena/trunk/jena-fuseki/fuseki Thu Apr 25 22:01:45 2013
@@ -39,10 +39,13 @@
 # FUSEKI_PID
 #   The FUSEKI PID file, defaults to $FUSEKI_RUN/fuseki.pid
 #
+# FUSEKI_CONF
+#   The FUSEKI Configuration file
+#
+# FUSEKI_USER
+#   If set, the server will be run as this user
 #
 # TODO:
-#   - Add support for start-stop-daemon (daemontools)
-#   - Support for running as a different user
 #   - A way to specify arguments to Fuseki (FUSEKI_ARGS)
 
 usage()
@@ -77,6 +80,10 @@ case "`uname`" in
     CYGWIN*) cygwin=true;;
 esac
 
+
+NAME=fuseki
+[ -f "/etc/default/$NAME" ] && . /etc/default/$NAME
+
 # Set FUSKEI_HOME to the script invocation directory if it is not specified
 if [ -z "$FUSEKI_HOME" ]
 then
@@ -115,7 +122,7 @@ fi
 # Find a location for the pid file
 if [ -z "$FUSEKI_RUN" ] 
 then
-  FUSEKI_RUN=$(findDirectory -w /var/run /usr/var/run /tmp)
+  FUSEKI_RUN=$(findDirectory -w /var/run /usr/var/run $FUSEKI_HOME /tmp)
 fi
 
 # Get PID file name
@@ -165,74 +172,169 @@ else
   DATA_DIR="$FUSEKI_DATA_DIR"
 fi
 
-
 #######################################
 #
 # TODO - Read these items from a Config file!
 #
 
 # Some JVM settings
-JAVA_OPTIONS=${JAVA_OPTIONS:--Dlog4j.configuration=log4j.properties -Xmx1200M}
+if [ -z "$JAVA_OPTIONS" ]
+then
+  JAVA_OPTIONS="-Dlog4j.configuration=log4j.properties -Xmx1200M"
+fi
 
-# Run command
+
+# Default Fuseki Arguments
 if [ -z "$FUSEKI_ARGS" ]
 then
-  FUSEKI_ARGS="--update --loc="$DATA_DIR" /ds"
+  if [ -z "$FUSEKI_CONF" ]
+  then  
+    FUSEKI_ARGS="--update --loc=$DATA_DIR /ds"
+  else
+    FUSEKI_ARGS="--config=$FUSEKI_CONF"
+  fi
 fi
 
-RUN_CMD=("$JAVA" ${JAVA_OPTIONS[@]} -jar "$FUSEKI_START" $FUSEKI_ARGS)
+# Run command
+
+RUN_ARGS=(${JAVA_OPTIONS[@]} -jar "$FUSEKI_START" $FUSEKI_ARGS)
+RUN_CMD=("$JAVA" ${RUN_ARGS[@]})
 
-#echo "DEBUG: RUN_CMD=${RUN_CMD[@]}"
 
 #######################################
 
+#####################################################
+# Comment these out after you're happy with what 
+# the script is doing.
+#####################################################
+if (( DEBUG ))
+then
+  echo "FUSEKI_HOME    =  $FUSEKI_HOME"
+  echo "FUSEKI_CONF    =  $FUSEKI_CONF"
+  echo "FUSEKI_RUN     =  $FUSEKI_RUN"
+  echo "FUSEKI_PID     =  $FUSEKI_PID"
+  echo "FUSEKI_ARGS    =  $FUSEKI_ARGS"
+  echo "FUSEKI_START   =  $FUSEKI_START"
+  echo "CONFIGS        =  ${CONFIGS[*]}"
+  echo "JAVA           =  $JAVA"
+  echo "JAVA_OPTIONS   =  ${JAVA_OPTIONS[*]}"
+  echo "RUN_ARGS       =  ${RUN_ARGS[@]}"
+  echo "RUN_CMD        =  ${RUN_CMD[@]}"
+fi
+
+NO_START=0
+
 # Life cycle functions
 start() {
 
+  if (( NO_START )); then 
+    echo "Not starting Fuseki - NO_START=1";
+    exit
+  fi
+
   # Make sure the data and log directories exist
   mkdir -p "$FUSEKI_DATA_DIR"
   mkdir -p "$FUSEKI_LOGS"
 
   echo -n "Starting Fuseki: "
-
-  # TODO Add support for start-stop-daemon
-  if [ -f "$FUSEKI_PID" ]
+  if type start-stop-daemon > /dev/null 2>&1 
   then
+    unset CH_USER
+    if [ -n "$FUSEKI_USER" ]
+    then
+      CH_USER="--chuid $FUSEKI_USER"
+    fi
+    if start-stop-daemon --start $CH_USER --chdir "$FUSEKI_HOME" --background --make-pidfile --pidfile "$FUSEKI_PID" --startas "$JAVA" -- "${RUN_ARGS[@]}"
+    then
+      sleep 1
+      if running "$FUSEKI_PID"
+      then
+        print_started
+      else
+        print_failed
+      fi
+    fi
+  else
     if running $FUSEKI_PID
     then
-      echo "Already Running!"
-      exit 1
+        echo "Already Running!"
+        exit 1
+      else
+        # dead pid file - remove
+        rm -f "$FUSEKI_PID"
+    fi
+    if [ "$FUSEKI_USER" ] 
+    then
+      touch "$FUSEKI_PID"
+      chown "$FUSEKI_USER" "$FUSEKI_PID"
+      su - "$FUSEKI_USER" -c "
+        echo 'Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT'
+        exec ${RUN_CMD[*]} &
+        disown \$!
+        echo \$! > '$FUSEKI_PID'"
     else
-      # dead pid file - remove
-      rm -f "$FUSEKI_PID"
+      echo "Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT"
+      exec "${RUN_CMD[@]}" &> "$FUSEKI_LOGS_STDERROUT" &
+      disown $!
+      echo $! > "$FUSEKI_PID"
     fi
+    
+    print_started
   fi
-  
-  # echo "Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT"
-  exec "${RUN_CMD[@]}" &> "$FUSEKI_LOGS_STDERROUT" &
-  disown $!
-  echo $! > "$FUSEKI_PID"
+}
 
+print_started() {
   echo "STARTED Fuseki `date`"
+  echo "PID=$(cat "$FUSEKI_PID" 2>/dev/null)"
+}
+
+print_failed() {
+  echo "FAILED to start Fuseki `date`"
+}
+
+delete_fuseki_pid_file() { 
+  rm -f "$FUSEKI_PID"
 }
 
 stop() {
   echo -n "Stopping Fuseki: "
 
-  PID=$(cat "$FUSEKI_PID" 2>/dev/null)
-  kill "$PID" 2>/dev/null
-  
-  TIMEOUT=30
-  while running $FUSEKI_PID; do
-    if (( TIMEOUT-- == 0 )); then
-      kill -KILL "$PID" 2>/dev/null
-    fi
-
-    sleep 1
-  done
+  if ! running "$FUSEKI_PID"
+    then
+    echo "Fuseki is not running"
+    exit 1
+  fi
 
-  rm -f "$FUSEKI_PID"
-  echo "OK"
+  ###############################################################
+  # !!!! This code needs to be improved, too many repeats !!!!  #
+  ###############################################################
+  if type start-stop-daemon > /dev/null 2>&1; then
+    start-stop-daemon --stop --pidfile "$FUSEKI_PID" --chdir "$FUSEKI_HOME" --startas "$JAVA" --signal HUP
+    
+    ## Die after a 30 second timeout
+    TIMEOUT=30
+    while running "$FUSEKI_PID"; do
+      if (( TIMEOUT-- == 0 )); then
+        start-stop-daemon --stop --pidfile "$FUSEKI_PID" --chdir "$FUSEKI_HOME" --startas "$JAVA" --signal KILL
+      fi
+        sleep 1
+    done
+    delete_fuseki_pid_file
+    echo OK
+  else
+    PID=$(cat "$FUSEKI_PID" 2>/dev/null)
+    kill "$PID" 2>/dev/null
+  
+    TIMEOUT=30
+    while running $FUSEKI_PID; do
+      if (( TIMEOUT-- == 0 )); then
+        kill -KILL "$PID" 2>/dev/null
+      fi
+      sleep 1
+    done
+    delete_fuseki_pid_file
+    echo "OK"
+  fi
 }
 
 case $1 in