This is an automated email from the ASF dual-hosted git repository.

yasith pushed a commit to branch distribution-improvements
in repository https://gitbox.apache.org/repos/asf/airavata.git

commit a1de99acf9d26f51615ab1a5eb7d09ea2e487c44
Author: yasithdev <[email protected]>
AuthorDate: Sun Jun 29 19:15:47 2025 -0500

    simplify starter scripts
---
 .../src/main/resources/bin/load-client.sh          |  84 ++++-----
 .../load-client/src/main/resources/bin/setenv.sh   | 142 ++++++++++++---
 .../resources/distribution/bin/agent-service.sh    | 167 +----------------
 .../src/main/resources/distribution/bin/setenv.sh  | 138 +++++++++++---
 .../resources/distribution/bin/airavata-server.sh  | 201 ++-------------------
 .../main/resources/distribution/bin/controller.sh  | 144 +--------------
 .../resources/distribution/bin/email-monitor.sh    | 144 +--------------
 .../main/resources/distribution/bin/parser-wm.sh   | 144 +--------------
 .../main/resources/distribution/bin/participant.sh | 144 +--------------
 .../src/main/resources/distribution/bin/post-wm.sh | 144 +--------------
 .../src/main/resources/distribution/bin/pre-wm.sh  | 144 +--------------
 .../resources/distribution/bin/realtime-monitor.sh | 144 +--------------
 .../src/main/resources/distribution/bin/setenv.sh  | 140 +++++++++++---
 .../resources/distribution/bin/sharing-registry.sh |  74 +-------
 .../distribution/bin/start-network-server.sh       | 180 ------------------
 .../resources/distribution/bin/file-service.sh     | 169 +----------------
 .../src/main/resources/distribution/bin/setenv.sh  | 138 +++++++++++---
 .../resources/distribution/bin/research-service.sh | 167 +----------------
 .../src/main/resources/distribution/bin/setenv.sh  | 138 +++++++++++---
 19 files changed, 665 insertions(+), 2081 deletions(-)

diff --git a/dev-tools/load-client/src/main/resources/bin/load-client.sh 
b/dev-tools/load-client/src/main/resources/bin/load-client.sh
index fe05e8d230..e10efac126 100644
--- a/dev-tools/load-client/src/main/resources/bin/load-client.sh
+++ b/dev-tools/load-client/src/main/resources/bin/load-client.sh
@@ -17,60 +17,40 @@
 # specific language governing permissions and limitations
 # under the License.
 
-. `dirname $0`/setenv.sh
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="logo.txt"
+# Source the common environment and functions
+. $(dirname $0)/setenv.sh
 
+# Client-specific configuration
+MAIN_CLASS="org.apache.airavata.tools.load.LoadClient"
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME}"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/airavata.out"
-LOG_FILE=$DEFAULT_LOG_FILE
 
-# parse command arguments
-for var in "$@"
-do
-    case ${var} in
-        -xdebug)
-               AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=8000"
-            shift
-           ;;
-        -log)
-            shift
-            LOG_FILE="$1"
-            shift
-            # If relative path, expand to absolute path using the user's $CWD
-            if [ -z "`echo "$LOG_FILE" | egrep "^/"`" ]; then
-                LOG_FILE="${CWD}/${LOG_FILE}"
-            fi
-        ;;
-        -h)
-            echo "Usage: load-client.sh"
-
-            echo "command options:"
-            echo "  -config             Load configuration file in yml format"
-            echo "  -apiHost            API Server host name"
-            echo "  -apiPort            API Server port"
-            echo "  -privateKeyPath     SSH private key path to communicate 
with storage resources (Defaults to user private key in ~/.ssh/id_rsa)"
-            echo "  -publicKeyPath      SSH public key path to communicate 
with storage resources (Defaults to user public key in ~/.ssh/id_rsa.pub)"
-            echo "  -passPhrase         SSH private key pass phrase (if any)"
-            echo "  -h                  Display this help and exit"
-            shift
-            exit 0
-        ;;
-           *)
-               EXTRA_ARGS="${EXTRA_ARGS} ${var}"
-            shift
-        ;;
-    esac
+# Parse client-specific arguments
+while (($# > 0)); do
+  case "$1" in
+  -xdebug)
+    JAVA_OPTS+=" -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=8000"
+    shift
+    ;;
+  -h)
+    echo "Usage: load-client.sh"
+    echo ""
+    echo "command options:"
+    echo "  -config             Load configuration file in yml format"
+    echo "  -apiHost            API Server host name"
+    echo "  -apiPort            API Server port"
+    echo "  -privateKeyPath     SSH private key path to communicate with 
storage resources (Defaults to user private key in ~/.ssh/id_rsa)"
+    echo "  -publicKeyPath      SSH public key path to communicate with 
storage resources (Defaults to user public key in ~/.ssh/id_rsa.pub)"
+    echo "  -passPhrase         SSH private key pass phrase (if any)"
+    echo "  -xdebug             Start under JPDA debugger"
+    echo "  -h                  Display this help and exit"
+    exit 0
+    ;;
+  *)
+    # Pass all other arguments to the Java application
+    break
+    ;;
+  esac
 done
 
-echo $*
-java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" \
-    org.apache.airavata.tools.load.LoadClient ${AIRAVATA_COMMAND} 
${EXTRA_ARGS} $*
+# Run the load client
+java ${JAVA_OPTS} -classpath "${CLASSPATH}" ${MAIN_CLASS} "$@"
diff --git a/dev-tools/load-client/src/main/resources/bin/setenv.sh 
b/dev-tools/load-client/src/main/resources/bin/setenv.sh
index 9e894e1db7..59cc88d4d2 100644
--- a/dev-tools/load-client/src/main/resources/bin/setenv.sh
+++ b/dev-tools/load-client/src/main/resources/bin/setenv.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements. See the NOTICE file
@@ -7,9 +7,9 @@
 # to you under the Apache License, Version 2.0 (the
 # "License"); you may not use this file except in compliance
 # with the License. You may obtain a copy of the License at
-# 
+#
 # http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -17,30 +17,126 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# resolve links - $0 may be a softlink
+# Resolve symlinks to get the real script location
 PRG="$0"
-
-while [ -h "$PRG" ]; do
-  ls=`ls -ld "$PRG"`
-  link=`expr "$ls" : '.*-> \(.*\)$'`
-  if expr "$link" : '.*/.*' > /dev/null; then
-    PRG="$link"
-  else
-    PRG=`dirname "$PRG"`/"$link"
-  fi
+while [ -L "$PRG" ]; do
+  PRG=$(readlink "$PRG")
 done
+PRGDIR=$(dirname "$PRG")
 
-PRGDIR=`dirname "$PRG"`
+# Set AIRAVATA_HOME if not already set
+[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=$(cd "$PRGDIR/.." && pwd)
 
-# Only set AIRAVATA_HOME if not already set
-[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=`cd "$PRGDIR/.." ; pwd`
+# Build CLASSPATH from all JAR files
+CLASSPATH=$(printf "%s:" "$AIRAVATA_HOME"/lib/*.jar)
+CLASSPATH=${CLASSPATH%:} # Remove trailing colon
 
-AIRAVATA_CLASSPATH=""
+export AIRAVATA_HOME CLASSPATH
 
-for f in "$AIRAVATA_HOME"/lib/*.jar
-do
-  AIRAVATA_CLASSPATH="$AIRAVATA_CLASSPATH":$f
-done
+# Common function to run Airavata services
+# Usage: run_service <service_name> <main_class> <java_opts>
+run_service() {
+  local SERVICE_NAME="$1" MAIN_CLASS="$2" JAVA_OPTS="$3"
+  local CWD="$PWD" PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
+  local DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
+  local LOG_FILE="$DEFAULT_LOG_FILE" DAEMON_MODE=false EXTRA_ARGS=""
+
+  # Help text
+  local HELP_TEXT="Usage: ${SERVICE_NAME}.sh
+
+command options:
+  -d                  Run in daemon mode
+  -xdebug             Start ${SERVICE_NAME} under JPDA debugger
+  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)
+  -h                  Display this help and exit
+
+Daemon mode commands (use with -d):
+  start               Start server in daemon mode
+  stop                Stop server running in daemon mode
+  restart             Restart server in daemon mode"
+
+  cd "${AIRAVATA_HOME}/bin"
+
+  # Helper function to stop daemon process
+  stop_daemon() {
+    if [[ -f "$PID_PATH_NAME" ]]; then
+      local PID=$(cat "$PID_PATH_NAME")
+      echo "$SERVICE_NAME stopping..."
+      kill "$PID"
+
+      local retry=0
+      while kill -0 "$PID" 2>/dev/null && ((retry++ < 20)); do
+        echo "[PID: $PID] Waiting for process to stop..."
+        sleep 1
+      done
+
+      if kill -0 "$PID" 2>/dev/null; then
+        echo "[PID: $PID] Forcefully killing non-responsive process..."
+        kill -9 "$PID"
+      fi
+
+      echo "$SERVICE_NAME is now stopped."
+      rm "$PID_PATH_NAME"
+      return 0
+    else
+      echo "$SERVICE_NAME is not running."
+      return 1
+    fi
+  }
+
+  # Helper function to start daemon process
+  start_daemon() {
+    echo "Starting $SERVICE_NAME ..."
+    if [[ ! -f "$PID_PATH_NAME" ]]; then
+      nohup java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" "$@" 
>"$LOG_FILE" 2>&1 &
+      echo $! >"$PID_PATH_NAME"
+      echo "$SERVICE_NAME now running: PID $(cat "$PID_PATH_NAME")"
+    else
+      echo "$SERVICE_NAME already running: PID $(cat "$PID_PATH_NAME")"
+    fi
+  }
+
+  # Parse command arguments
+  while (($# > 0)); do
+    case "$1" in
+    -d) DAEMON_MODE=true ;;
+    -xdebug) JAVA_OPTS+=" -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000" ;;
+    -log)
+      shift
+      LOG_FILE="$1"
+      [[ "$LOG_FILE" != /* ]] && LOG_FILE="${CWD}/${LOG_FILE}"
+      ;;
+    start | stop | restart)
+      if [[ "$DAEMON_MODE" == true ]]; then
+        case "$1" in
+        start) start_daemon "$@" ;;
+        stop) stop_daemon ;;
+        restart)
+          stop_daemon
+          start_daemon "$@"
+          ;;
+        esac
+        exit 0
+      else
+        EXTRA_ARGS+=" $1"
+      fi
+      ;;
+    -h)
+      echo "$HELP_TEXT"
+      exit 0
+      ;;
+    *) EXTRA_ARGS+=" $1" ;;
+    esac
+    shift
+  done
+
+  # Validate daemon mode usage
+  if [[ "$DAEMON_MODE" == true ]]; then
+    echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
+    echo "Use -h for help"
+    exit 1
+  fi
 
-export AIRAVATA_HOME
-export AIRAVATA_CLASSPATH
+  # Run in foreground mode
+  java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" $EXTRA_ARGS
+}
diff --git 
a/modules/agent-framework/agent-service/src/main/resources/distribution/bin/agent-service.sh
 
b/modules/agent-framework/agent-service/src/main/resources/distribution/bin/agent-service.sh
index d3289c694c..f89493c3c2 100755
--- 
a/modules/agent-framework/agent-service/src/main/resources/distribution/bin/agent-service.sh
+++ 
b/modules/agent-framework/agent-service/src/main/resources/distribution/bin/agent-service.sh
@@ -18,170 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="agent-service"
 
MAIN_CLASS="org.apache.airavata.agent.connection.service.AgentServiceApplication"
+JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml 
-Dairavata.server.truststore.path=${AIRAVATA_HOME}/conf/airavata.jks 
-Dspring.config.location=${AIRAVATA_HOME}/conf/"
 
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
-JAVA_OPTS="-Dairavata.server.truststore.path=${AIRAVATA_HOME}/conf/airavata.jks
 -Dspring.config.location=${AIRAVATA_HOME}/conf/ 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# Function to start the service
-start_service() {
-  if [ "$DAEMON_MODE" = true ]; then
-    echo "Starting $SERVICE_NAME in daemon mode..."
-    if [ ! -f $PID_PATH_NAME ]; then
-      nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-      echo $! >$PID_PATH_NAME
-      echo "$SERVICE_NAME started ..."
-    else
-      echo "$SERVICE_NAME is already running ..."
-    fi
-  else
-    echo "Starting $SERVICE_NAME in interactive mode..."
-    java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $*
-  fi
-}
-
-# Function to stop the service
-stop_service() {
-  if [ -f $PID_PATH_NAME ]; then
-    PID=$(cat $PID_PATH_NAME)
-    echo "$SERVICE_NAME stopping ..."
-    kill $PID
-    RETRY=0
-    while kill -0 $PID 2>/dev/null; do
-      echo "Waiting for the process $PID to be stopped"
-      RETRY=$(expr ${RETRY} + 1)
-      if [ "${RETRY}" -gt "20" ]; then
-        echo "Forcefully killing the process as it is not responding ..."
-        kill -9 $PID
-      fi
-      sleep 1
-    done
-    echo "$SERVICE_NAME stopped ..."
-    rm $PID_PATH_NAME
-  else
-    echo "$SERVICE_NAME is not running ..."
-  fi
-}
-
-# Function to restart the service
-restart_service() {
-  if [ -f $PID_PATH_NAME ]; then
-    PID=$(cat $PID_PATH_NAME)
-    echo "$SERVICE_NAME stopping ..."
-    kill $PID
-    RETRY=0
-    while kill -0 $PID 2>/dev/null; do
-      echo "Waiting for the process $PID to be stopped"
-      RETRY=$(expr ${RETRY} + 1)
-      if [ "${RETRY}" -gt "20" ]; then
-        echo "Forcefully killing the process as it is not responding ..."
-        kill -9 $PID
-      fi
-      sleep 1
-    done
-    echo "$SERVICE_NAME stopped ..."
-    rm $PID_PATH_NAME
-  fi
-  start_service $*
-}
-
-# Function to show help
-show_help() {
-  echo "Usage: agent-service.sh [options] [command]"
-  echo ""
-  echo "Commands (daemon mode only):"
-  echo "  start               Start server in daemon mode"
-  echo "  stop                Stop server running in daemon mode"
-  echo "  restart             Restart server in daemon mode"
-  echo ""
-  echo "Options:"
-  echo "  -d                  Run in daemon mode"
-  echo "  -xdebug             Start Connection Service under JPDA debugger"
-  echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-  echo "  -h                  Display this help and exit"
-  echo ""
-  echo "Examples:"
-  echo "  agent-service.sh                    # Run in interactive mode"
-  echo "  agent-service.sh -d start           # Start in daemon mode"
-  echo "  agent-service.sh -d stop            # Stop daemon"
-  echo "  agent-service.sh -d restart         # Restart daemon"
-  echo "  agent-service.sh -xdebug            # Run with debugger in 
interactive mode"
-}
-
-# parse command arguments
-for var in "$@"; do
-  case ${var} in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      start_service $*
-      exit 0
-    else
-      echo "Error: 'start' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      stop_service
-      exit 0
-    else
-      echo "Error: 'stop' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      restart_service $*
-      exit 0
-    else
-      echo "Error: 'restart' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  -h)
-    show_help
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} ${var}"
-    shift
-    ;;
-  esac
-done
-
-# If no specific command was given, run in interactive mode
-if [ "$DAEMON_MODE" = false ]; then
-  java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $*
-fi
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git 
a/modules/agent-framework/agent-service/src/main/resources/distribution/bin/setenv.sh
 
b/modules/agent-framework/agent-service/src/main/resources/distribution/bin/setenv.sh
index 3f1d7632bf..59cc88d4d2 100755
--- 
a/modules/agent-framework/agent-service/src/main/resources/distribution/bin/setenv.sh
+++ 
b/modules/agent-framework/agent-service/src/main/resources/distribution/bin/setenv.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements. See the NOTICE file
@@ -17,30 +17,126 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# resolve links - $0 may be a softlink
+# Resolve symlinks to get the real script location
 PRG="$0"
-
-while [ -h "$PRG" ]; do
-  ls=`ls -ld "$PRG"`
-  link=`expr "$ls" : '.*-> \(.*\)$'`
-  if expr "$link" : '.*/.*' > /dev/null; then
-    PRG="$link"
-  else
-    PRG=`dirname "$PRG"`/"$link"
-  fi
+while [ -L "$PRG" ]; do
+  PRG=$(readlink "$PRG")
 done
+PRGDIR=$(dirname "$PRG")
 
-PRGDIR=`dirname "$PRG"`
+# Set AIRAVATA_HOME if not already set
+[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=$(cd "$PRGDIR/.." && pwd)
 
-# Only set AIRAVATA_HOME if not already set
-[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=`cd "$PRGDIR/.." ; pwd`
+# Build CLASSPATH from all JAR files
+CLASSPATH=$(printf "%s:" "$AIRAVATA_HOME"/lib/*.jar)
+CLASSPATH=${CLASSPATH%:} # Remove trailing colon
 
-AIRAVATA_CLASSPATH=""
+export AIRAVATA_HOME CLASSPATH
 
-for f in "$AIRAVATA_HOME"/lib/*.jar
-do
-  AIRAVATA_CLASSPATH="$AIRAVATA_CLASSPATH":$f
-done
+# Common function to run Airavata services
+# Usage: run_service <service_name> <main_class> <java_opts>
+run_service() {
+  local SERVICE_NAME="$1" MAIN_CLASS="$2" JAVA_OPTS="$3"
+  local CWD="$PWD" PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
+  local DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
+  local LOG_FILE="$DEFAULT_LOG_FILE" DAEMON_MODE=false EXTRA_ARGS=""
+
+  # Help text
+  local HELP_TEXT="Usage: ${SERVICE_NAME}.sh
+
+command options:
+  -d                  Run in daemon mode
+  -xdebug             Start ${SERVICE_NAME} under JPDA debugger
+  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)
+  -h                  Display this help and exit
+
+Daemon mode commands (use with -d):
+  start               Start server in daemon mode
+  stop                Stop server running in daemon mode
+  restart             Restart server in daemon mode"
+
+  cd "${AIRAVATA_HOME}/bin"
+
+  # Helper function to stop daemon process
+  stop_daemon() {
+    if [[ -f "$PID_PATH_NAME" ]]; then
+      local PID=$(cat "$PID_PATH_NAME")
+      echo "$SERVICE_NAME stopping..."
+      kill "$PID"
+
+      local retry=0
+      while kill -0 "$PID" 2>/dev/null && ((retry++ < 20)); do
+        echo "[PID: $PID] Waiting for process to stop..."
+        sleep 1
+      done
+
+      if kill -0 "$PID" 2>/dev/null; then
+        echo "[PID: $PID] Forcefully killing non-responsive process..."
+        kill -9 "$PID"
+      fi
+
+      echo "$SERVICE_NAME is now stopped."
+      rm "$PID_PATH_NAME"
+      return 0
+    else
+      echo "$SERVICE_NAME is not running."
+      return 1
+    fi
+  }
+
+  # Helper function to start daemon process
+  start_daemon() {
+    echo "Starting $SERVICE_NAME ..."
+    if [[ ! -f "$PID_PATH_NAME" ]]; then
+      nohup java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" "$@" 
>"$LOG_FILE" 2>&1 &
+      echo $! >"$PID_PATH_NAME"
+      echo "$SERVICE_NAME now running: PID $(cat "$PID_PATH_NAME")"
+    else
+      echo "$SERVICE_NAME already running: PID $(cat "$PID_PATH_NAME")"
+    fi
+  }
+
+  # Parse command arguments
+  while (($# > 0)); do
+    case "$1" in
+    -d) DAEMON_MODE=true ;;
+    -xdebug) JAVA_OPTS+=" -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000" ;;
+    -log)
+      shift
+      LOG_FILE="$1"
+      [[ "$LOG_FILE" != /* ]] && LOG_FILE="${CWD}/${LOG_FILE}"
+      ;;
+    start | stop | restart)
+      if [[ "$DAEMON_MODE" == true ]]; then
+        case "$1" in
+        start) start_daemon "$@" ;;
+        stop) stop_daemon ;;
+        restart)
+          stop_daemon
+          start_daemon "$@"
+          ;;
+        esac
+        exit 0
+      else
+        EXTRA_ARGS+=" $1"
+      fi
+      ;;
+    -h)
+      echo "$HELP_TEXT"
+      exit 0
+      ;;
+    *) EXTRA_ARGS+=" $1" ;;
+    esac
+    shift
+  done
+
+  # Validate daemon mode usage
+  if [[ "$DAEMON_MODE" == true ]]; then
+    echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
+    echo "Use -h for help"
+    exit 1
+  fi
 
-export AIRAVATA_HOME
-export AIRAVATA_CLASSPATH
\ No newline at end of file
+  # Run in foreground mode
+  java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" $EXTRA_ARGS
+}
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/airavata-server.sh 
b/modules/distribution/src/main/resources/distribution/bin/airavata-server.sh
index 05d15fdfdd..ed4cadb07b 100755
--- 
a/modules/distribution/src/main/resources/distribution/bin/airavata-server.sh
+++ 
b/modules/distribution/src/main/resources/distribution/bin/airavata-server.sh
@@ -18,210 +18,45 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="airavata-server"
 MAIN_CLASS="org.apache.airavata.server.ServerMain"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-IS_DAEMON_MODE=false
-LOGO=true
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-FORCE=false
-ACTION=""
 
-# parse command arguments
-while [ $# -gt 0 ]; do
+SERVERS=""
+ARGS=()
+while [[ $# -gt 0 ]]; do
   case $1 in
-  -d)
-    IS_DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
   -security)
-    JAVA_OPTS="${JAVA_OPTS} -Djava.security.manager 
-Djava.security.policy=${AIRAVATA_HOME}/conf/axis2.policy 
-Daxis2.home=${AIRAVATA_HOME}"
+    JAVA_OPTS+=" -Djava.security.manager 
-Djava.security.policy=${AIRAVATA_HOME}/conf/axis2.policy 
-Daxis2.home=${AIRAVATA_HOME}"
     shift
     ;;
   -enableLegacyTLS)
-    # Enable TLS v1 and v1.1.  disableSystemPropertiesFile is needed
-    # because the system properties file takes precedence. See 'man 
update-crypto-policies' for more info.
-    JAVA_OPTS="${JAVA_OPTS} 
-Djava.security.policy=${AIRAVATA_HOME}/bin/enableLegacyTLS.security 
-Djava.security.disableSystemPropertiesFile=true"
-    shift
-    ;;
-  -nologo)
-    LOGO=false
-    shift
-    ;;
-  -log)
-    shift
-    if [ $# -eq 0 ]; then
-      echo "Error: -log requires a filename"
-      exit 1
-    fi
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  -f | --force)
-    FORCE=true
+    JAVA_OPTS+=" 
-Djava.security.policy=${AIRAVATA_HOME}/bin/enableLegacyTLS.security 
-Djava.security.disableSystemPropertiesFile=true"
     shift
     ;;
-  start)
-    ACTION="start"
+  apiserver | gfac | orchestrator | credentialstore | regserver)
+    if [ -z "$SERVERS" ]; then SERVERS="$1"; else SERVERS="$SERVERS,$1"; fi
     shift
     ;;
-  stop)
-    ACTION="stop"
+  all | api-orch | execution)
+    SERVERS="$1"
     shift
     ;;
-  -h)
-    echo "Usage: airavata-server [command-options] {start|stop}"
-    echo ""
-    echo "Commands:"
-    echo "  start               Start Airavata server(s)"
-    echo "  stop                Stop Airavata server(s)"
-    echo ""
-    echo "Server names (for start command):"
-    echo "  apiserver           Start apiserver"
-    echo "  gfac                Start gfac server"
-    echo "  orchestrator        Start orchestrator server"
-    echo "  credentialstore     Start credentialstore server"
-    echo "  regserver           Start registry server"
-    echo "  all                 Start all servers in one JVM"
-    echo "  api-orch            Start API and orchestrator servers"
-    echo "  execution           Start execution-related servers"
-    echo ""
-    echo "Command options:"
-    echo "  -d                  Start server in daemon mode"
-    echo "  -xdebug             Start Airavata Server under JPDA debugger"
-    echo "  -nologo             Do not show airavata logo"
-    echo "  -security           Enable Java 2 security"
-    echo "  -enableLegacyTLS    Enable TLS v1 and v1.1"
-    echo "  -f, --force         Force stop all servers (for stop command)"
-    echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-    echo "  --<key>[=<value>]   Server setting(s) to override or introduce 
(overrides values in airavata-server.properties)"
-    echo "  -h                  Display this help and exit"
-    echo ""
-    echo "Examples:"
-    echo "  airavata-server start apiserver"
-    echo "  airavata-server -d start api-orch"
-    echo "  airavata-server start -d -log custom.log all"
-    echo "  airavata-server -d stop"
-    echo "  airavata-server stop -f"
-    exit 0
-    ;;
   *)
-    # Handle server names and other arguments based on action
-    if [ "$ACTION" = "start" ]; then
-      case $1 in
-      apiserver | gfac | orchestrator | credentialstore | regserver)
-        if [ -z ${SERVERS} ]; then
-          SERVERS="${1}"
-        else
-          SERVERS="${SERVERS},${1}"
-        fi
-        ;;
-      all | api-orch | execution)
-        IS_SUBSET=true
-        SUBSET="${1}"
-        ;;
-      *)
-        EXTRA_ARGS="${EXTRA_ARGS} $1"
-        ;;
-      esac
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-    fi
+    ARGS+=("$1")
     shift
     ;;
   esac
 done
-
-# Check if action was specified
-if [ -z "$ACTION" ]; then
-  echo "Error: No action specified. Use 'start' or 'stop'"
-  echo "Use -h for help"
-  exit 1
-fi
-
-# Validate force flag usage
-if [ "$FORCE" = true ] && [ "$ACTION" != "stop" ]; then
-  echo "Error: -f/--force flag is only valid with 'stop' command"
-  exit 1
-fi
-
-# Handle start action
-if [ "$ACTION" = "start" ]; then
-  # Construct Airavata command arguments in proper order.
-  if ${IS_SUBSET}; then
-    AIRAVATA_COMMAND="--servers=${SUBSET} ${AIRAVATA_COMMAND} ${EXTRA_ARGS}"
+CONSTRUCTED_ARGS=()
+if [[ " ${ARGS[*]} " =~ " start " ]]; then
+  if [ -n "$SERVERS" ]; then
+    CONSTRUCTED_ARGS+=("--servers=${SERVERS}")
   else
-    if [ -z ${SERVERS} ]; then
-      echo "You should provide at least one server component to start the 
airavata server. Please use -h option to get more details."
-      exit 1
-    else
-      AIRAVATA_COMMAND="--servers=${SERVERS} ${AIRAVATA_COMMAND} ${EXTRA_ARGS}"
-    fi
-  fi
-
-  # Print logo file
-  if ${LOGO}; then
-    if [ -e ${LOGO_FILE} ]; then
-      cat ${LOGO_FILE}
-    fi
-  fi
-
-  if ${IS_DAEMON_MODE}; then
-    echo "Starting ${SERVICE_NAME} in daemon mode..."
-    echo "Redirecting output to $LOG_FILE"
-    nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} >$LOG_FILE 2>&1 &
-    echo $! >$PID_PATH_NAME
-    echo "$SERVICE_NAME started with PID $(cat $PID_PATH_NAME)"
-  else
-    java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND}
+    echo "You should provide at least one server component to start the 
airavata server. Please use -h option to get more details."
+    exit 1
   fi
 fi
 
-# Handle stop action
-if [ "$ACTION" = "stop" ]; then
-  if ${FORCE}; then
-    for f in $(find . -name "server_start_*"); do
-      # split file name using "_" underscore
-      f_split=(${f//_/ })
-      echo "Found process file : $f"
-      echo -n "    Sending kill signals to process ${f_split[2]}..."
-      out=$(kill -9 ${f_split[2]} 2>&1)
-      if [ -z "$out" ]; then
-        echo "done"
-      else
-        echo "failed (REASON: $out)"
-      fi
-      echo -n "    Removing process file..."
-      out=$(rm ${f} 2>&1)
-      if [ -z "$out" ]; then
-        echo "done"
-      else
-        echo "failed (REASON: $out)"
-      fi
-    done
-  else
-    java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} stop 
${AIRAVATA_COMMAND} ${EXTRA_ARGS}
-  fi
-fi
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "${ARGS[@]}" 
"${CONSTRUCTED_ARGS[@]}"
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/controller.sh 
b/modules/distribution/src/main/resources/distribution/bin/controller.sh
old mode 100644
new mode 100755
index a114d38525..4e145cd5ee
--- a/modules/distribution/src/main/resources/distribution/bin/controller.sh
+++ b/modules/distribution/src/main/resources/distribution/bin/controller.sh
@@ -18,149 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="controller"
 MAIN_CLASS="org.apache.airavata.helix.impl.controller.HelixController"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-LOGO=true
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# parse command arguments
-while [ $# -gt 0 ]; do
-  case $1 in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      echo "Starting $SERVICE_NAME ..."
-      if [ ! -f $PID_PATH_NAME ]; then
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started with PID $(cat $PID_PATH_NAME)"
-      else
-        echo "$SERVICE_NAME is already running with PID $(cat $PID_PATH_NAME)"
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-        echo "$SERVICE_NAME starting ..."
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started ..."
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  -h)
-    echo "Usage: controller.sh"
-
-    echo "command options:"
-    echo "  -d                  Run in daemon mode"
-    echo "  -xdebug             Start Controller under JPDA debugger"
-    echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-    echo "  -h                  Display this help and exit"
-    echo ""
-    echo "Daemon mode commands (use with -d):"
-    echo "  start               Start server in daemon mode"
-    echo "  stop                Stop server running in daemon mode"
-    echo "  restart             Restart server in daemon mode"
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} $1"
-    shift
-    ;;
-  esac
-done
-
-# If in daemon mode but no daemon command specified, show error
-if [ "$DAEMON_MODE" = true ]; then
-  echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
-  echo "Use -h for help"
-  exit 1
-fi
 
-# Run in foreground mode
-java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} ${EXTRA_ARGS}
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/email-monitor.sh 
b/modules/distribution/src/main/resources/distribution/bin/email-monitor.sh
old mode 100644
new mode 100755
index 10243a9661..beb11ebbad
--- a/modules/distribution/src/main/resources/distribution/bin/email-monitor.sh
+++ b/modules/distribution/src/main/resources/distribution/bin/email-monitor.sh
@@ -18,149 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="email-monitor"
 MAIN_CLASS="org.apache.airavata.monitor.email.EmailBasedMonitor"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-LOGO=true
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# parse command arguments
-while [ $# -gt 0 ]; do
-  case $1 in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      echo "Starting $SERVICE_NAME ..."
-      if [ ! -f $PID_PATH_NAME ]; then
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started with PID $(cat $PID_PATH_NAME)"
-      else
-        echo "$SERVICE_NAME is already running with PID $(cat $PID_PATH_NAME)"
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-        echo "$SERVICE_NAME starting ..."
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started ..."
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  -h)
-    echo "Usage: email-monitor.sh"
-
-    echo "command options:"
-    echo "  -d                  Run in daemon mode"
-    echo "  -xdebug             Start Email Monitor under JPDA debugger"
-    echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-    echo "  -h                  Display this help and exit"
-    echo ""
-    echo "Daemon mode commands (use with -d):"
-    echo "  start               Start server in daemon mode"
-    echo "  stop                Stop server running in daemon mode"
-    echo "  restart             Restart server in daemon mode"
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} $1"
-    shift
-    ;;
-  esac
-done
-
-# If in daemon mode but no daemon command specified, show error
-if [ "$DAEMON_MODE" = true ]; then
-  echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
-  echo "Use -h for help"
-  exit 1
-fi
 
-# Run in foreground mode
-java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} ${EXTRA_ARGS}
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/parser-wm.sh 
b/modules/distribution/src/main/resources/distribution/bin/parser-wm.sh
old mode 100644
new mode 100755
index c0d1e233ae..f451c6dabb
--- a/modules/distribution/src/main/resources/distribution/bin/parser-wm.sh
+++ b/modules/distribution/src/main/resources/distribution/bin/parser-wm.sh
@@ -18,149 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="parser-wm"
 MAIN_CLASS="org.apache.airavata.helix.impl.workflow.ParserWorkflowManager"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-LOGO=true
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# parse command arguments
-while [ $# -gt 0 ]; do
-  case $1 in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      echo "Starting $SERVICE_NAME ..."
-      if [ ! -f $PID_PATH_NAME ]; then
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started with PID $(cat $PID_PATH_NAME)"
-      else
-        echo "$SERVICE_NAME is already running with PID $(cat $PID_PATH_NAME)"
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-        echo "$SERVICE_NAME starting ..."
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started ..."
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  -h)
-    echo "Usage: parser-wm.sh"
-
-    echo "command options:"
-    echo "  -d                  Run in daemon mode"
-    echo "  -xdebug             Start Parser Workflow Manager under JPDA 
debugger"
-    echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-    echo "  -h                  Display this help and exit"
-    echo ""
-    echo "Daemon mode commands (use with -d):"
-    echo "  start               Start server in daemon mode"
-    echo "  stop                Stop server running in daemon mode"
-    echo "  restart             Restart server in daemon mode"
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} $1"
-    shift
-    ;;
-  esac
-done
-
-# If in daemon mode but no daemon command specified, show error
-if [ "$DAEMON_MODE" = true ]; then
-  echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
-  echo "Use -h for help"
-  exit 1
-fi
 
-# Run in foreground mode
-java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} ${EXTRA_ARGS}
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/participant.sh 
b/modules/distribution/src/main/resources/distribution/bin/participant.sh
old mode 100644
new mode 100755
index 80c3cea70f..2f8730c743
--- a/modules/distribution/src/main/resources/distribution/bin/participant.sh
+++ b/modules/distribution/src/main/resources/distribution/bin/participant.sh
@@ -18,149 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="participant"
 MAIN_CLASS="org.apache.airavata.helix.impl.participant.GlobalParticipant"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-LOGO=true
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# parse command arguments
-while [ $# -gt 0 ]; do
-  case $1 in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      echo "Starting $SERVICE_NAME ..."
-      if [ ! -f $PID_PATH_NAME ]; then
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started with PID $(cat $PID_PATH_NAME)"
-      else
-        echo "$SERVICE_NAME is already running with PID $(cat $PID_PATH_NAME)"
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-        echo "$SERVICE_NAME starting ..."
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started ..."
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  -h)
-    echo "Usage: participant.sh"
-
-    echo "command options:"
-    echo "  -d                  Run in daemon mode"
-    echo "  -xdebug             Start Helix Participant under JPDA debugger"
-    echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-    echo "  -h                  Display this help and exit"
-    echo ""
-    echo "Daemon mode commands (use with -d):"
-    echo "  start               Start server in daemon mode"
-    echo "  stop                Stop server running in daemon mode"
-    echo "  restart             Restart server in daemon mode"
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} $1"
-    shift
-    ;;
-  esac
-done
-
-# If in daemon mode but no daemon command specified, show error
-if [ "$DAEMON_MODE" = true ]; then
-  echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
-  echo "Use -h for help"
-  exit 1
-fi
 
-# Run in foreground mode
-java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} ${EXTRA_ARGS}
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/post-wm.sh 
b/modules/distribution/src/main/resources/distribution/bin/post-wm.sh
old mode 100644
new mode 100755
index f290dd925b..6d867cdcba
--- a/modules/distribution/src/main/resources/distribution/bin/post-wm.sh
+++ b/modules/distribution/src/main/resources/distribution/bin/post-wm.sh
@@ -18,149 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="post-wm"
 MAIN_CLASS="org.apache.airavata.helix.impl.workflow.PostWorkflowManager"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-LOGO=true
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# parse command arguments
-while [ $# -gt 0 ]; do
-  case $1 in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      echo "Starting $SERVICE_NAME ..."
-      if [ ! -f $PID_PATH_NAME ]; then
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started with PID $(cat $PID_PATH_NAME)"
-      else
-        echo "$SERVICE_NAME is already running with PID $(cat $PID_PATH_NAME)"
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-        echo "$SERVICE_NAME starting ..."
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started ..."
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  -h)
-    echo "Usage: post-wm.sh"
-
-    echo "command options:"
-    echo "  -d                  Run in daemon mode"
-    echo "  -xdebug             Start Post Workflow Manager under JPDA 
debugger"
-    echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-    echo "  -h                  Display this help and exit"
-    echo ""
-    echo "Daemon mode commands (use with -d):"
-    echo "  start               Start server in daemon mode"
-    echo "  stop                Stop server running in daemon mode"
-    echo "  restart             Restart server in daemon mode"
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} $1"
-    shift
-    ;;
-  esac
-done
-
-# If in daemon mode but no daemon command specified, show error
-if [ "$DAEMON_MODE" = true ]; then
-  echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
-  echo "Use -h for help"
-  exit 1
-fi
 
-# Run in foreground mode
-java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} ${EXTRA_ARGS}
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git a/modules/distribution/src/main/resources/distribution/bin/pre-wm.sh 
b/modules/distribution/src/main/resources/distribution/bin/pre-wm.sh
old mode 100644
new mode 100755
index 7ba5896444..c8f1dc3bab
--- a/modules/distribution/src/main/resources/distribution/bin/pre-wm.sh
+++ b/modules/distribution/src/main/resources/distribution/bin/pre-wm.sh
@@ -18,149 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="pre-wm"
 MAIN_CLASS="org.apache.airavata.helix.impl.workflow.PreWorkflowManager"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-LOGO=true
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# parse command arguments
-while [ $# -gt 0 ]; do
-  case $1 in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      echo "Starting $SERVICE_NAME ..."
-      if [ ! -f $PID_PATH_NAME ]; then
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started with PID $(cat $PID_PATH_NAME)"
-      else
-        echo "$SERVICE_NAME is already running with PID $(cat $PID_PATH_NAME)"
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-        echo "$SERVICE_NAME starting ..."
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started ..."
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  -h)
-    echo "Usage: pre-wm.sh"
-
-    echo "command options:"
-    echo "  -d                  Run in daemon mode"
-    echo "  -xdebug             Start Pre Workflow Manager under JPDA debugger"
-    echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-    echo "  -h                  Display this help and exit"
-    echo ""
-    echo "Daemon mode commands (use with -d):"
-    echo "  start               Start server in daemon mode"
-    echo "  stop                Stop server running in daemon mode"
-    echo "  restart             Restart server in daemon mode"
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} $1"
-    shift
-    ;;
-  esac
-done
-
-# If in daemon mode but no daemon command specified, show error
-if [ "$DAEMON_MODE" = true ]; then
-  echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
-  echo "Use -h for help"
-  exit 1
-fi
 
-# Run in foreground mode
-java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} ${EXTRA_ARGS}
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/realtime-monitor.sh 
b/modules/distribution/src/main/resources/distribution/bin/realtime-monitor.sh
old mode 100644
new mode 100755
index 8389c321bd..347fd24a21
--- 
a/modules/distribution/src/main/resources/distribution/bin/realtime-monitor.sh
+++ 
b/modules/distribution/src/main/resources/distribution/bin/realtime-monitor.sh
@@ -18,149 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="realtime-monitor"
 MAIN_CLASS="org.apache.airavata.monitor.realtime.RealtimeMonitor"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
 JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-LOGO=true
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# parse command arguments
-while [ $# -gt 0 ]; do
-  case $1 in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      echo "Starting $SERVICE_NAME ..."
-      if [ ! -f $PID_PATH_NAME ]; then
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started with PID $(cat $PID_PATH_NAME)"
-      else
-        echo "$SERVICE_NAME is already running with PID $(cat $PID_PATH_NAME)"
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      if [ -f $PID_PATH_NAME ]; then
-        PID=$(cat $PID_PATH_NAME)
-        echo "$SERVICE_NAME stopping ..."
-        kill $PID
-        RETRY=0
-        while kill -0 $PID 2>/dev/null; do
-          echo "Waiting for the process $PID to be stopped"
-          RETRY=$(expr ${RETRY} + 1)
-          if [ "${RETRY}" -gt "20" ]; then
-            echo "Forcefully killing the process as it is not responding ..."
-            kill -9 $PID
-          fi
-          sleep 1
-        done
-        echo "$SERVICE_NAME stopped ..."
-        rm $PID_PATH_NAME
-        echo "$SERVICE_NAME starting ..."
-        nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" 
${MAIN_CLASS} ${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-        echo $! >$PID_PATH_NAME
-        echo "$SERVICE_NAME started ..."
-      else
-        echo "$SERVICE_NAME is not running ..."
-      fi
-      exit 0
-    else
-      EXTRA_ARGS="${EXTRA_ARGS} $1"
-      shift
-    fi
-    ;;
-  -h)
-    echo "Usage: realtime-monitor.sh"
-
-    echo "command options:"
-    echo "  -d                  Run in daemon mode"
-    echo "  -xdebug             Start Realtime Monitor under JPDA debugger"
-    echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-    echo "  -h                  Display this help and exit"
-    echo ""
-    echo "Daemon mode commands (use with -d):"
-    echo "  start               Start server in daemon mode"
-    echo "  stop                Stop server running in daemon mode"
-    echo "  restart             Restart server in daemon mode"
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} $1"
-    shift
-    ;;
-  esac
-done
-
-# If in daemon mode but no daemon command specified, show error
-if [ "$DAEMON_MODE" = true ]; then
-  echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
-  echo "Use -h for help"
-  exit 1
-fi
 
-# Run in foreground mode
-java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} ${EXTRA_ARGS}
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git a/modules/distribution/src/main/resources/distribution/bin/setenv.sh 
b/modules/distribution/src/main/resources/distribution/bin/setenv.sh
index 98c9836753..59cc88d4d2 100755
--- a/modules/distribution/src/main/resources/distribution/bin/setenv.sh
+++ b/modules/distribution/src/main/resources/distribution/bin/setenv.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements. See the NOTICE file
@@ -17,32 +17,126 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# resolve links - $0 may be a softlink
+# Resolve symlinks to get the real script location
 PRG="$0"
-
-while [ -h "$PRG" ]; do
-  ls=$(ls -ld "$PRG")
-  link=$(expr "$ls" : '.*-> \(.*\)$')
-  if expr "$link" : '.*/.*' >/dev/null; then
-    PRG="$link"
-  else
-    PRG=$(dirname "$PRG")/"$link"
-  fi
+while [ -L "$PRG" ]; do
+  PRG=$(readlink "$PRG")
 done
-
 PRGDIR=$(dirname "$PRG")
 
-# Only set AIRAVATA_HOME if not already set
-[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=$(
-  cd "$PRGDIR/.."
-  pwd
-)
+# Set AIRAVATA_HOME if not already set
+[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=$(cd "$PRGDIR/.." && pwd)
 
-AIRAVATA_CLASSPATH=""
+# Build CLASSPATH from all JAR files
+CLASSPATH=$(printf "%s:" "$AIRAVATA_HOME"/lib/*.jar)
+CLASSPATH=${CLASSPATH%:} # Remove trailing colon
 
-for f in "$AIRAVATA_HOME"/lib/*.jar; do
-  AIRAVATA_CLASSPATH="$AIRAVATA_CLASSPATH":$f
-done
+export AIRAVATA_HOME CLASSPATH
+
+# Common function to run Airavata services
+# Usage: run_service <service_name> <main_class> <java_opts>
+run_service() {
+  local SERVICE_NAME="$1" MAIN_CLASS="$2" JAVA_OPTS="$3"
+  local CWD="$PWD" PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
+  local DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
+  local LOG_FILE="$DEFAULT_LOG_FILE" DAEMON_MODE=false EXTRA_ARGS=""
+
+  # Help text
+  local HELP_TEXT="Usage: ${SERVICE_NAME}.sh
+
+command options:
+  -d                  Run in daemon mode
+  -xdebug             Start ${SERVICE_NAME} under JPDA debugger
+  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)
+  -h                  Display this help and exit
+
+Daemon mode commands (use with -d):
+  start               Start server in daemon mode
+  stop                Stop server running in daemon mode
+  restart             Restart server in daemon mode"
+
+  cd "${AIRAVATA_HOME}/bin"
+
+  # Helper function to stop daemon process
+  stop_daemon() {
+    if [[ -f "$PID_PATH_NAME" ]]; then
+      local PID=$(cat "$PID_PATH_NAME")
+      echo "$SERVICE_NAME stopping..."
+      kill "$PID"
+
+      local retry=0
+      while kill -0 "$PID" 2>/dev/null && ((retry++ < 20)); do
+        echo "[PID: $PID] Waiting for process to stop..."
+        sleep 1
+      done
+
+      if kill -0 "$PID" 2>/dev/null; then
+        echo "[PID: $PID] Forcefully killing non-responsive process..."
+        kill -9 "$PID"
+      fi
+
+      echo "$SERVICE_NAME is now stopped."
+      rm "$PID_PATH_NAME"
+      return 0
+    else
+      echo "$SERVICE_NAME is not running."
+      return 1
+    fi
+  }
+
+  # Helper function to start daemon process
+  start_daemon() {
+    echo "Starting $SERVICE_NAME ..."
+    if [[ ! -f "$PID_PATH_NAME" ]]; then
+      nohup java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" "$@" 
>"$LOG_FILE" 2>&1 &
+      echo $! >"$PID_PATH_NAME"
+      echo "$SERVICE_NAME now running: PID $(cat "$PID_PATH_NAME")"
+    else
+      echo "$SERVICE_NAME already running: PID $(cat "$PID_PATH_NAME")"
+    fi
+  }
+
+  # Parse command arguments
+  while (($# > 0)); do
+    case "$1" in
+    -d) DAEMON_MODE=true ;;
+    -xdebug) JAVA_OPTS+=" -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000" ;;
+    -log)
+      shift
+      LOG_FILE="$1"
+      [[ "$LOG_FILE" != /* ]] && LOG_FILE="${CWD}/${LOG_FILE}"
+      ;;
+    start | stop | restart)
+      if [[ "$DAEMON_MODE" == true ]]; then
+        case "$1" in
+        start) start_daemon "$@" ;;
+        stop) stop_daemon ;;
+        restart)
+          stop_daemon
+          start_daemon "$@"
+          ;;
+        esac
+        exit 0
+      else
+        EXTRA_ARGS+=" $1"
+      fi
+      ;;
+    -h)
+      echo "$HELP_TEXT"
+      exit 0
+      ;;
+    *) EXTRA_ARGS+=" $1" ;;
+    esac
+    shift
+  done
+
+  # Validate daemon mode usage
+  if [[ "$DAEMON_MODE" == true ]]; then
+    echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
+    echo "Use -h for help"
+    exit 1
+  fi
 
-export AIRAVATA_HOME
-export AIRAVATA_CLASSPATH
+  # Run in foreground mode
+  java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" $EXTRA_ARGS
+}
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/sharing-registry.sh 
b/modules/distribution/src/main/resources/distribution/bin/sharing-registry.sh
old mode 100644
new mode 100755
index 4d16828dc2..9ce01762ae
--- 
a/modules/distribution/src/main/resources/distribution/bin/sharing-registry.sh
+++ 
b/modules/distribution/src/main/resources/distribution/bin/sharing-registry.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements. See the NOTICE file
@@ -18,75 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="sharing-registry"
 MAIN_CLASS="org.apache.airavata.sharing.registry.server.ServerMain"
+JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
 
-cd $SHARING_REGISTRY_HOME/bin
-
-IS_DAEMON_MODE=false
-SHARING_REGISTRY_COMMAND=""
-STOP=false
-FORCE=false
-JAVA_OPTS=""
-
-for var in "$@"; do
-  case $var in
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=8000"
-    shift
-    ;;
-  start)
-    IS_DAEMON_MODE=true
-    shift
-    ;;
-  stop)
-    STOP=true
-    SHARING_REGISTRY_COMMAND="$
-           SHARING_REGISTRY_COMMAND $var"
-    shift
-    ;;
-  -h)
-    echo "Usage: sharing-registry.sh [command-options]"
-    echo "command options:"
-    echo "  start              Start server in daemon mode"
-    echo "  stop               Stop server."
-    echo "  -xdebug                       Start Sharing Registry Server under 
JPDA debugger"
-    echo "  -h                 Display this help and exit"
-    shift
-    exit 0
-    ;;
-  *)
-    SHARING_REGISTRY_COMMAND="$SHARING_REGISTRY_COMMAND $var"
-    shift
-    ;;
-  esac
-done
-
-if $STOP; then
-  for f in $(find . -name "server_start_*"); do
-    IFS='_' read -a f_split <<<"$f"
-    echo "Found process file : $f"
-    echo -n "    Sending kill signals to process ${f_split[2]}..."
-    out=$(kill -9 ${f_split[2]} 2>&1)
-    if [ -z "$out" ]; then
-      echo "done"
-    else
-      echo "failed (REASON: $out)"
-    fi
-    echo -n "    Removing process file..."
-    out=$(rm $f 2>&1)
-    if [ -z "$out" ]; then
-      echo "done"
-    else
-      echo "failed (REASON: $out)"
-    fi
-  done
-else
-  if $IS_DAEMON_MODE; then
-    echo "Starting ${SERVICE_NAME} in daemon mode..."
-    $JAVA_HOME/bin/java ${JAVA_OPTS} -classpath "$SHARING_REGISTRY_CLASSPATH" 
${MAIN_CLASS} $* >$LOG_FILE 2>&1 &
-  else
-    $JAVA_HOME/bin/java ${JAVA_OPTS} -classpath "$SHARING_REGISTRY_CLASSPATH" 
${MAIN_CLASS} $*
-  fi
-fi
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git 
a/modules/distribution/src/main/resources/distribution/bin/start-network-server.sh
 
b/modules/distribution/src/main/resources/distribution/bin/start-network-server.sh
deleted file mode 100644
index b1204ab6f4..0000000000
--- 
a/modules/distribution/src/main/resources/distribution/bin/start-network-server.sh
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-
-#   http://www.apache.org/licenses/LICENSE-2.0
-
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-. $(dirname $0)/setenv.sh
-SERVICE_NAME="network-server"
-MAIN_CLASS="org.apache.derby.drda.NetworkServerControl"
-
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-
-if [ -n "$derby_common_debug" ]; then
-  set -x
-fi
-
-# OS specific support.  $var _must_ be set to either true or false.
-cygwin=false
-darwin=false
-case "$(uname)" in
-CYGWIN*) cygwin=true ;;
-Darwin*)
-  darwin=true
-  if [ -z "$JAVA_HOME" ]; then
-    JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
-  fi
-  ;;
-esac
-
-if [ -z "$DERBY_HOME" -o ! -d "$DERBY_HOME" ]; then
-  ## resolve links - $0 may be a link to derby's home
-  PRG="$0"
-  progname=$(basename "$0")
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ]; do
-    ls=$(ls -ld "$PRG")
-    link=$(expr "$ls" : '.*-> \(.*\)$')
-    if expr "$link" : '/.*' >/dev/null; then
-      PRG="$link"
-    else
-      PRG=$(dirname "$PRG")"/$link"
-    fi
-  done
-
-  DERBY_HOME=$(dirname "$PRG")/..
-
-  # make it fully qualified
-  DERBY_HOME=$(cd "$DERBY_HOME" && pwd)
-fi
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched
-if $cygwin; then
-  [ -n "$DERBY_HOME" ] &&
-    DERBY_HOME=$(cygpath --unix "$DERBY_HOME")
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
-fi
-
-# set DERBY_LIB location
-DERBY_LIB="${DERBY_HOME}/lib"
-
-if [ -z "$JAVACMD" ]; then
-  if [ -n "$JAVA_HOME" ]; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
-      # IBM's JDK on AIX uses strange locations for the executables
-      JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-      JAVACMD="$JAVA_HOME/bin/java"
-    fi
-  else
-    JAVACMD=$(which java 2>/dev/null)
-    if [ -z "$JAVACMD" ]; then
-      JAVACMD=java
-    fi
-  fi
-fi
-
-if [ ! -x "$JAVACMD" ]; then
-  echo "Error: JAVA_HOME is not defined correctly."
-  echo "  We cannot execute $JAVACMD"
-  exit 1
-fi
-
-# set local classpath, don't overwrite the user's
-LOCALCLASSPATH=$DERBY_LIB/derby.jar:$DERBY_LIB/derbynet.jar:$DERBY_LIB/derbytools.jar:$DERBY_LIB/derbyclient.jar
-
-# if CLASSPATH_OVERRIDE env var is set, LOCALCLASSPATH will be
-# user CLASSPATH first and derby-found jars after.
-# In that case, the user CLASSPATH will override derby-found jars
-#
-# if CLASSPATH_OVERRIDE is not set, we'll have the normal behaviour
-# with derby-found jars first and user CLASSPATH after
-if [ -n "$CLASSPATH" ]; then
-  # merge local and specified classpath
-  if [ -z "$LOCALCLASSPATH" ]; then
-    LOCALCLASSPATH="$CLASSPATH"
-  elif [ -n "$CLASSPATH_OVERRIDE" ]; then
-    LOCALCLASSPATH="$CLASSPATH:$LOCALCLASSPATH"
-  else
-    LOCALCLASSPATH="$LOCALCLASSPATH:$CLASSPATH"
-  fi
-
-  # remove class path from launcher -cp option
-  CLASSPATH=""
-fi
-
-# For Cygwin, switch paths to appropriate format before running java
-# For PATHs convert to unix format first, then to windows format to ensure
-# both formats are supported. Probably this will fail on directories with ;
-# in the name in the path. Let's assume that paths containing ; are more
-# rare than windows style paths on cygwin.
-if $cygwin; then
-  if [ "$OS" = "Windows_NT" ] && cygpath -m . >/dev/null 2>/dev/null; then
-    format=mixed
-  else
-    format=windows
-  fi
-  DERBY_HOME=$(cygpath --$format "$DERBY_HOME")
-  DERBY_LIB=$(cygpath --$format "$DERBY_LIB")
-  if [ -n "$JAVA_HOME" ]; then
-    JAVA_HOME=$(cygpath --$format "$JAVA_HOME")
-  fi
-  LCP_TEMP=$(cygpath --path --unix "$LOCALCLASSPATH")
-  LOCALCLASSPATH=$(cygpath --path --$format "$LCP_TEMP")
-  if [ -n "$CLASSPATH" ]; then
-    CP_TEMP=$(cygpath --path --unix "$CLASSPATH")
-    CLASSPATH=$(cygpath --path --$format "$CP_TEMP")
-  fi
-  CYGHOME=$(cygpath --$format "$HOME")
-fi
-
-# add a second backslash to variables terminated by a backslash under cygwin
-if $cygwin; then
-  case "$DERBY_HOME" in
-  *\\)
-    DERBY_HOME="$DERBY_HOME\\"
-    ;;
-  esac
-  case "$CYGHOME" in
-  *\\)
-    CYGHOME="$CYGHOME\\"
-    ;;
-  esac
-  case "$LOCALCLASSPATH" in
-  *\\)
-    LOCALCLASSPATH="$LOCALCLASSPATH\\"
-    ;;
-  esac
-  case "$CLASSPATH" in
-  *\\)
-    CLASSPATH="$CLASSPATH\\"
-    ;;
-  esac
-fi
-
-# Readjust classpath for MKS
-# expr match
-if [ \( "$(expr $SHELL : '.*sh.exe$')" -gt 0 \) -a \( "$cygwin" = "false" \) 
]; then
-  LOCALCLASSPATH=$(echo $LOCALCLASSPATH | sed -E 's/([\d\w]*):([\d\w]*)/\1;\2/g
-')
-fi
-
-derby_exec_command="exec \"$JAVACMD\" $DERBY_OPTS -classpath 
\"$LOCALCLASSPATH\" ${MAIN_CLASS} start $@"
-eval $derby_exec_command
diff --git 
a/modules/file-server/src/main/resources/distribution/bin/file-service.sh 
b/modules/file-server/src/main/resources/distribution/bin/file-service.sh
index 18e744c933..e380ac51db 100644
--- a/modules/file-server/src/main/resources/distribution/bin/file-service.sh
+++ b/modules/file-server/src/main/resources/distribution/bin/file-service.sh
@@ -17,171 +17,10 @@
 # specific language governing permissions and limitations
 # under the License.
 
-. `dirname $0`/setenv.sh
+. $(dirname $0)/setenv.sh
+
 SERVICE_NAME="file-service"
 MAIN_CLASS="org.apache.airavata.file.server.FileServerApplication"
+JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml 
-Dspring.config.location=${AIRAVATA_HOME}/conf/"
 
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
-JAVA_OPTS="-Dspring.config.location=${AIRAVATA_HOME}/conf/ 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# Function to start the service
-start_service() {
-  if [ "$DAEMON_MODE" = true ]; then
-    echo "Starting $SERVICE_NAME in daemon mode..."
-    if [ ! -f $PID_PATH_NAME ]; then
-      nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-      echo $! >$PID_PATH_NAME
-      echo "$SERVICE_NAME started ..."
-    else
-      echo "$SERVICE_NAME is already running ..."
-    fi
-  else
-    echo "Starting $SERVICE_NAME in interactive mode..."
-    java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $*
-  fi
-}
-
-# Function to stop the service
-stop_service() {
-  if [ -f $PID_PATH_NAME ]; then
-    PID=$(cat $PID_PATH_NAME)
-    echo "$SERVICE_NAME stopping ..."
-    kill $PID
-    RETRY=0
-    while kill -0 $PID 2>/dev/null; do
-      echo "Waiting for the process $PID to be stopped"
-      RETRY=$(expr ${RETRY} + 1)
-      if [ "${RETRY}" -gt "20" ]; then
-        echo "Forcefully killing the process as it is not responding ..."
-        kill -9 $PID
-      fi
-      sleep 1
-    done
-    echo "$SERVICE_NAME stopped ..."
-    rm $PID_PATH_NAME
-  else
-    echo "$SERVICE_NAME is not running ..."
-  fi
-}
-
-# Function to restart the service
-restart_service() {
-  if [ -f $PID_PATH_NAME ]; then
-    PID=$(cat $PID_PATH_NAME)
-    echo "$SERVICE_NAME stopping ..."
-    kill $PID
-    RETRY=0
-    while kill -0 $PID 2>/dev/null; do
-      echo "Waiting for the process $PID to be stopped"
-      RETRY=$(expr ${RETRY} + 1)
-      if [ "${RETRY}" -gt "20" ]; then
-        echo "Forcefully killing the process as it is not responding ..."
-        kill -9 $PID
-      fi
-      sleep 1
-    done
-    echo "$SERVICE_NAME stopped ..."
-    rm $PID_PATH_NAME
-  fi
-  start_service $*
-}
-
-# Function to show help
-show_help() {
-  echo "Usage: file-service.sh [options] [command]"
-  echo ""
-  echo "Commands (daemon mode only):"
-  echo "  start               Start server in daemon mode"
-  echo "  stop                Stop server running in daemon mode"
-  echo "  restart             Restart server in daemon mode"
-  echo ""
-  echo "Options:"
-  echo "  -d                  Run in daemon mode"
-  echo "  -xdebug             Start File Service under JPDA debugger"
-  echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-  echo "  -h                  Display this help and exit"
-  echo ""
-  echo "Examples:"
-  echo "  file-service.sh                    # Run in interactive mode"
-  echo "  file-service.sh -d start           # Start in daemon mode"
-  echo "  file-service.sh -d stop            # Stop daemon"
-  echo "  file-service.sh -d restart         # Restart daemon"
-  echo "  file-service.sh -xdebug            # Run with debugger in 
interactive mode"
-}
-
-# parse command arguments
-for var in "$@"; do
-  case ${var} in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      start_service $*
-      exit 0
-    else
-      echo "Error: 'start' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      stop_service
-      exit 0
-    else
-      echo "Error: 'stop' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      restart_service $*
-      exit 0
-    else
-      echo "Error: 'restart' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  -h)
-    show_help
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} ${var}"
-    shift
-    ;;
-  esac
-done
-
-# If no specific command was given, run in interactive mode
-if [ "$DAEMON_MODE" = false ]; then
-  java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $*
-fi
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git a/modules/file-server/src/main/resources/distribution/bin/setenv.sh 
b/modules/file-server/src/main/resources/distribution/bin/setenv.sh
index 3f1d7632bf..59cc88d4d2 100644
--- a/modules/file-server/src/main/resources/distribution/bin/setenv.sh
+++ b/modules/file-server/src/main/resources/distribution/bin/setenv.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements. See the NOTICE file
@@ -17,30 +17,126 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# resolve links - $0 may be a softlink
+# Resolve symlinks to get the real script location
 PRG="$0"
-
-while [ -h "$PRG" ]; do
-  ls=`ls -ld "$PRG"`
-  link=`expr "$ls" : '.*-> \(.*\)$'`
-  if expr "$link" : '.*/.*' > /dev/null; then
-    PRG="$link"
-  else
-    PRG=`dirname "$PRG"`/"$link"
-  fi
+while [ -L "$PRG" ]; do
+  PRG=$(readlink "$PRG")
 done
+PRGDIR=$(dirname "$PRG")
 
-PRGDIR=`dirname "$PRG"`
+# Set AIRAVATA_HOME if not already set
+[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=$(cd "$PRGDIR/.." && pwd)
 
-# Only set AIRAVATA_HOME if not already set
-[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=`cd "$PRGDIR/.." ; pwd`
+# Build CLASSPATH from all JAR files
+CLASSPATH=$(printf "%s:" "$AIRAVATA_HOME"/lib/*.jar)
+CLASSPATH=${CLASSPATH%:} # Remove trailing colon
 
-AIRAVATA_CLASSPATH=""
+export AIRAVATA_HOME CLASSPATH
 
-for f in "$AIRAVATA_HOME"/lib/*.jar
-do
-  AIRAVATA_CLASSPATH="$AIRAVATA_CLASSPATH":$f
-done
+# Common function to run Airavata services
+# Usage: run_service <service_name> <main_class> <java_opts>
+run_service() {
+  local SERVICE_NAME="$1" MAIN_CLASS="$2" JAVA_OPTS="$3"
+  local CWD="$PWD" PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
+  local DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
+  local LOG_FILE="$DEFAULT_LOG_FILE" DAEMON_MODE=false EXTRA_ARGS=""
+
+  # Help text
+  local HELP_TEXT="Usage: ${SERVICE_NAME}.sh
+
+command options:
+  -d                  Run in daemon mode
+  -xdebug             Start ${SERVICE_NAME} under JPDA debugger
+  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)
+  -h                  Display this help and exit
+
+Daemon mode commands (use with -d):
+  start               Start server in daemon mode
+  stop                Stop server running in daemon mode
+  restart             Restart server in daemon mode"
+
+  cd "${AIRAVATA_HOME}/bin"
+
+  # Helper function to stop daemon process
+  stop_daemon() {
+    if [[ -f "$PID_PATH_NAME" ]]; then
+      local PID=$(cat "$PID_PATH_NAME")
+      echo "$SERVICE_NAME stopping..."
+      kill "$PID"
+
+      local retry=0
+      while kill -0 "$PID" 2>/dev/null && ((retry++ < 20)); do
+        echo "[PID: $PID] Waiting for process to stop..."
+        sleep 1
+      done
+
+      if kill -0 "$PID" 2>/dev/null; then
+        echo "[PID: $PID] Forcefully killing non-responsive process..."
+        kill -9 "$PID"
+      fi
+
+      echo "$SERVICE_NAME is now stopped."
+      rm "$PID_PATH_NAME"
+      return 0
+    else
+      echo "$SERVICE_NAME is not running."
+      return 1
+    fi
+  }
+
+  # Helper function to start daemon process
+  start_daemon() {
+    echo "Starting $SERVICE_NAME ..."
+    if [[ ! -f "$PID_PATH_NAME" ]]; then
+      nohup java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" "$@" 
>"$LOG_FILE" 2>&1 &
+      echo $! >"$PID_PATH_NAME"
+      echo "$SERVICE_NAME now running: PID $(cat "$PID_PATH_NAME")"
+    else
+      echo "$SERVICE_NAME already running: PID $(cat "$PID_PATH_NAME")"
+    fi
+  }
+
+  # Parse command arguments
+  while (($# > 0)); do
+    case "$1" in
+    -d) DAEMON_MODE=true ;;
+    -xdebug) JAVA_OPTS+=" -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000" ;;
+    -log)
+      shift
+      LOG_FILE="$1"
+      [[ "$LOG_FILE" != /* ]] && LOG_FILE="${CWD}/${LOG_FILE}"
+      ;;
+    start | stop | restart)
+      if [[ "$DAEMON_MODE" == true ]]; then
+        case "$1" in
+        start) start_daemon "$@" ;;
+        stop) stop_daemon ;;
+        restart)
+          stop_daemon
+          start_daemon "$@"
+          ;;
+        esac
+        exit 0
+      else
+        EXTRA_ARGS+=" $1"
+      fi
+      ;;
+    -h)
+      echo "$HELP_TEXT"
+      exit 0
+      ;;
+    *) EXTRA_ARGS+=" $1" ;;
+    esac
+    shift
+  done
+
+  # Validate daemon mode usage
+  if [[ "$DAEMON_MODE" == true ]]; then
+    echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
+    echo "Use -h for help"
+    exit 1
+  fi
 
-export AIRAVATA_HOME
-export AIRAVATA_CLASSPATH
\ No newline at end of file
+  # Run in foreground mode
+  java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" $EXTRA_ARGS
+}
diff --git 
a/modules/research-framework/research-service/src/main/resources/distribution/bin/research-service.sh
 
b/modules/research-framework/research-service/src/main/resources/distribution/bin/research-service.sh
index 6aad39fca9..fdda7eaa78 100755
--- 
a/modules/research-framework/research-service/src/main/resources/distribution/bin/research-service.sh
+++ 
b/modules/research-framework/research-service/src/main/resources/distribution/bin/research-service.sh
@@ -18,170 +18,9 @@
 # under the License.
 
 . $(dirname $0)/setenv.sh
+
 SERVICE_NAME="research-service"
 MAIN_CLASS="org.apache.airavata.research.service.ResearchServiceApplication"
+JAVA_OPTS="-Dairavata.config.dir=${AIRAVATA_HOME}/conf 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml 
-Dairavata.server.truststore.path=${AIRAVATA_HOME}/conf/airavata.jks 
-Dspring.config.location=${AIRAVATA_HOME}/conf/"
 
-# Capture user's working dir before changing directory
-CWD="$PWD"
-cd ${AIRAVATA_HOME}/bin
-LOGO_FILE="${AIRAVATA_HOME}/logo.txt"
-
-JAVA_OPTS="-Dairavata.server.truststore.path=${AIRAVATA_HOME}/conf/airavata.jks
 -Dspring.config.location=${AIRAVATA_HOME}/conf/ 
-Dairavata.home=${AIRAVATA_HOME} 
-Dlog4j.configurationFile=file:${AIRAVATA_HOME}/conf/log4j2.xml"
-AIRAVATA_COMMAND=""
-EXTRA_ARGS=""
-SERVERS=""
-IS_SUBSET=false
-SUBSET=""
-DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
-LOG_FILE=$DEFAULT_LOG_FILE
-DAEMON_MODE=false
-PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
-
-# Function to start the service
-start_service() {
-  if [ "$DAEMON_MODE" = true ]; then
-    echo "Starting $SERVICE_NAME in daemon mode..."
-    if [ ! -f $PID_PATH_NAME ]; then
-      nohup java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $* >$LOG_FILE 2>&1 &
-      echo $! >$PID_PATH_NAME
-      echo "$SERVICE_NAME started ..."
-    else
-      echo "$SERVICE_NAME is already running ..."
-    fi
-  else
-    echo "Starting $SERVICE_NAME in interactive mode..."
-    java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $*
-  fi
-}
-
-# Function to stop the service
-stop_service() {
-  if [ -f $PID_PATH_NAME ]; then
-    PID=$(cat $PID_PATH_NAME)
-    echo "$SERVICE_NAME stopping ..."
-    kill $PID
-    RETRY=0
-    while kill -0 $PID 2>/dev/null; do
-      echo "Waiting for the process $PID to be stopped"
-      RETRY=$(expr ${RETRY} + 1)
-      if [ "${RETRY}" -gt "20" ]; then
-        echo "Forcefully killing the process as it is not responding ..."
-        kill -9 $PID
-      fi
-      sleep 1
-    done
-    echo "$SERVICE_NAME stopped ..."
-    rm $PID_PATH_NAME
-  else
-    echo "$SERVICE_NAME is not running ..."
-  fi
-}
-
-# Function to restart the service
-restart_service() {
-  if [ -f $PID_PATH_NAME ]; then
-    PID=$(cat $PID_PATH_NAME)
-    echo "$SERVICE_NAME stopping ..."
-    kill $PID
-    RETRY=0
-    while kill -0 $PID 2>/dev/null; do
-      echo "Waiting for the process $PID to be stopped"
-      RETRY=$(expr ${RETRY} + 1)
-      if [ "${RETRY}" -gt "20" ]; then
-        echo "Forcefully killing the process as it is not responding ..."
-        kill -9 $PID
-      fi
-      sleep 1
-    done
-    echo "$SERVICE_NAME stopped ..."
-    rm $PID_PATH_NAME
-  fi
-  start_service $*
-}
-
-# Function to show help
-show_help() {
-  echo "Usage: research-service.sh [options] [command]"
-  echo ""
-  echo "Commands (daemon mode only):"
-  echo "  start               Start server in daemon mode"
-  echo "  stop                Stop server running in daemon mode"
-  echo "  restart             Restart server in daemon mode"
-  echo ""
-  echo "Options:"
-  echo "  -d                  Run in daemon mode"
-  echo "  -xdebug             Start Research Service under JPDA debugger"
-  echo "  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)"
-  echo "  -h                  Display this help and exit"
-  echo ""
-  echo "Examples:"
-  echo "  research-service.sh                    # Run in interactive mode"
-  echo "  research-service.sh -d start           # Start in daemon mode"
-  echo "  research-service.sh -d stop            # Stop daemon"
-  echo "  research-service.sh -d restart         # Restart daemon"
-  echo "  research-service.sh -xdebug            # Run with debugger in 
interactive mode"
-}
-
-# parse command arguments
-for var in "$@"; do
-  case ${var} in
-  -d)
-    DAEMON_MODE=true
-    shift
-    ;;
-  -xdebug)
-    AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-    JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
-    shift
-    ;;
-  -log)
-    shift
-    LOG_FILE="$1"
-    shift
-    # If relative path, expand to absolute path using the user's $CWD
-    if [ -z "$(echo "$LOG_FILE" | egrep "^/")" ]; then
-      LOG_FILE="${CWD}/${LOG_FILE}"
-    fi
-    ;;
-  start)
-    if [ "$DAEMON_MODE" = true ]; then
-      start_service $*
-      exit 0
-    else
-      echo "Error: 'start' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  stop)
-    if [ "$DAEMON_MODE" = true ]; then
-      stop_service
-      exit 0
-    else
-      echo "Error: 'stop' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  restart)
-    if [ "$DAEMON_MODE" = true ]; then
-      restart_service $*
-      exit 0
-    else
-      echo "Error: 'restart' command requires daemon mode (-d flag)"
-      exit 1
-    fi
-    ;;
-  -h)
-    show_help
-    exit 0
-    ;;
-  *)
-    EXTRA_ARGS="${EXTRA_ARGS} ${var}"
-    shift
-    ;;
-  esac
-done
-
-# If no specific command was given, run in interactive mode
-if [ "$DAEMON_MODE" = false ]; then
-  java ${JAVA_OPTS} -classpath "${AIRAVATA_CLASSPATH}" ${MAIN_CLASS} 
${AIRAVATA_COMMAND} $*
-fi
+run_service "$SERVICE_NAME" "$MAIN_CLASS" "$JAVA_OPTS" "$@"
diff --git 
a/modules/research-framework/research-service/src/main/resources/distribution/bin/setenv.sh
 
b/modules/research-framework/research-service/src/main/resources/distribution/bin/setenv.sh
index 3f1d7632bf..59cc88d4d2 100755
--- 
a/modules/research-framework/research-service/src/main/resources/distribution/bin/setenv.sh
+++ 
b/modules/research-framework/research-service/src/main/resources/distribution/bin/setenv.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements. See the NOTICE file
@@ -17,30 +17,126 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# resolve links - $0 may be a softlink
+# Resolve symlinks to get the real script location
 PRG="$0"
-
-while [ -h "$PRG" ]; do
-  ls=`ls -ld "$PRG"`
-  link=`expr "$ls" : '.*-> \(.*\)$'`
-  if expr "$link" : '.*/.*' > /dev/null; then
-    PRG="$link"
-  else
-    PRG=`dirname "$PRG"`/"$link"
-  fi
+while [ -L "$PRG" ]; do
+  PRG=$(readlink "$PRG")
 done
+PRGDIR=$(dirname "$PRG")
 
-PRGDIR=`dirname "$PRG"`
+# Set AIRAVATA_HOME if not already set
+[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=$(cd "$PRGDIR/.." && pwd)
 
-# Only set AIRAVATA_HOME if not already set
-[ -z "$AIRAVATA_HOME" ] && AIRAVATA_HOME=`cd "$PRGDIR/.." ; pwd`
+# Build CLASSPATH from all JAR files
+CLASSPATH=$(printf "%s:" "$AIRAVATA_HOME"/lib/*.jar)
+CLASSPATH=${CLASSPATH%:} # Remove trailing colon
 
-AIRAVATA_CLASSPATH=""
+export AIRAVATA_HOME CLASSPATH
 
-for f in "$AIRAVATA_HOME"/lib/*.jar
-do
-  AIRAVATA_CLASSPATH="$AIRAVATA_CLASSPATH":$f
-done
+# Common function to run Airavata services
+# Usage: run_service <service_name> <main_class> <java_opts>
+run_service() {
+  local SERVICE_NAME="$1" MAIN_CLASS="$2" JAVA_OPTS="$3"
+  local CWD="$PWD" PID_PATH_NAME="${AIRAVATA_HOME}/bin/pid-${SERVICE_NAME}"
+  local DEFAULT_LOG_FILE="${AIRAVATA_HOME}/logs/${SERVICE_NAME}.log"
+  local LOG_FILE="$DEFAULT_LOG_FILE" DAEMON_MODE=false EXTRA_ARGS=""
+
+  # Help text
+  local HELP_TEXT="Usage: ${SERVICE_NAME}.sh
+
+command options:
+  -d                  Run in daemon mode
+  -xdebug             Start ${SERVICE_NAME} under JPDA debugger
+  -log <LOG_FILE>     Where to redirect stdout/stderr (defaults to 
$DEFAULT_LOG_FILE)
+  -h                  Display this help and exit
+
+Daemon mode commands (use with -d):
+  start               Start server in daemon mode
+  stop                Stop server running in daemon mode
+  restart             Restart server in daemon mode"
+
+  cd "${AIRAVATA_HOME}/bin"
+
+  # Helper function to stop daemon process
+  stop_daemon() {
+    if [[ -f "$PID_PATH_NAME" ]]; then
+      local PID=$(cat "$PID_PATH_NAME")
+      echo "$SERVICE_NAME stopping..."
+      kill "$PID"
+
+      local retry=0
+      while kill -0 "$PID" 2>/dev/null && ((retry++ < 20)); do
+        echo "[PID: $PID] Waiting for process to stop..."
+        sleep 1
+      done
+
+      if kill -0 "$PID" 2>/dev/null; then
+        echo "[PID: $PID] Forcefully killing non-responsive process..."
+        kill -9 "$PID"
+      fi
+
+      echo "$SERVICE_NAME is now stopped."
+      rm "$PID_PATH_NAME"
+      return 0
+    else
+      echo "$SERVICE_NAME is not running."
+      return 1
+    fi
+  }
+
+  # Helper function to start daemon process
+  start_daemon() {
+    echo "Starting $SERVICE_NAME ..."
+    if [[ ! -f "$PID_PATH_NAME" ]]; then
+      nohup java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" "$@" 
>"$LOG_FILE" 2>&1 &
+      echo $! >"$PID_PATH_NAME"
+      echo "$SERVICE_NAME now running: PID $(cat "$PID_PATH_NAME")"
+    else
+      echo "$SERVICE_NAME already running: PID $(cat "$PID_PATH_NAME")"
+    fi
+  }
+
+  # Parse command arguments
+  while (($# > 0)); do
+    case "$1" in
+    -d) DAEMON_MODE=true ;;
+    -xdebug) JAVA_OPTS+=" -Xdebug -Xnoagent 
-Xrunjdwp:transport=dt_socket,server=y,address=*:8000" ;;
+    -log)
+      shift
+      LOG_FILE="$1"
+      [[ "$LOG_FILE" != /* ]] && LOG_FILE="${CWD}/${LOG_FILE}"
+      ;;
+    start | stop | restart)
+      if [[ "$DAEMON_MODE" == true ]]; then
+        case "$1" in
+        start) start_daemon "$@" ;;
+        stop) stop_daemon ;;
+        restart)
+          stop_daemon
+          start_daemon "$@"
+          ;;
+        esac
+        exit 0
+      else
+        EXTRA_ARGS+=" $1"
+      fi
+      ;;
+    -h)
+      echo "$HELP_TEXT"
+      exit 0
+      ;;
+    *) EXTRA_ARGS+=" $1" ;;
+    esac
+    shift
+  done
+
+  # Validate daemon mode usage
+  if [[ "$DAEMON_MODE" == true ]]; then
+    echo "Error: Daemon mode (-d) requires one of: start, stop, restart"
+    echo "Use -h for help"
+    exit 1
+  fi
 
-export AIRAVATA_HOME
-export AIRAVATA_CLASSPATH
\ No newline at end of file
+  # Run in foreground mode
+  java $JAVA_OPTS -classpath "$CLASSPATH" "$MAIN_CLASS" $EXTRA_ARGS
+}

Reply via email to