Startup script linux

From OpenSimulator

(Difference between revisions)
Jump to: navigation, search
(Undo revision 16911 by Tedd (Talk))
(Updated script)
(18 intermediate revisions by 9 users not shown)
Line 1: Line 1:
== /etc/init.d script for Linux ==
+
= /etc/init.d script for Linux =
  
=== Instructions ===
+
== Instructions ==
  
 
Tested on Debian 5. CHUIDS user to opensim user. Supports: start, stop, restart, status  
 
Tested on Debian 5. CHUIDS user to opensim user. Supports: start, stop, restart, status  
  
 
To implement: Type: cat > /etc/init.d/opensim Paste in script from this page Press: CTRL+D Type: chmod +x /etc/init.d/opensim Script should now be located on server and be executable.  
 
To implement: Type: cat > /etc/init.d/opensim Paste in script from this page Press: CTRL+D Type: chmod +x /etc/init.d/opensim Script should now be located on server and be executable.  
 
Type: update-rc.d opensim defaults Script should now be in your startup.
 
  
 
Modify header in script to adapt it to your installation folder and user.  
 
Modify header in script to adapt it to your installation folder and user.  
  
NOTE: stop-command currently doesn't work properly (it doesn't do a soft shutdown). It will kill OpenSim first with kill pid, then kill -9 pid. So make sure you have saved your data. :)
+
== Updated script ==
  
=== Script ===
+
Unlike Tedd's original script below, this relies on OpenSimulator's own PID functionality to work, so you must uncomment the PIDFile entries in the [Startup] section of OpenSim.ini/Robust.ini and set them to /tmp/OpenSim.exe.pid and /tmp/Robust.exe.pid as appropriate.
  
<code></code>
+
This allows us to simplify the script and get better error reporting.  Cleanly shutting down OpenSimulator has also been implemented.
  
  #! /bin/sh
+
The delay between attempting clean shutdown and force shutting down has been doubled to 20 seconds. However, in some cases this still might not be enough.  In the future, it would be better to poll for status.
 +
 
 +
This script is maintained at https://github.com/justincc/opensimulator-tools/blob/master/infrastructure/control/init.d/src/opensim  Pull requests welcome!
 +
 
 +
<source lang="bash">
 +
#! /bin/sh
 +
### BEGIN INIT INFO
 +
# Provides:          OpenSimulator
 +
# Required-Start:    $local_fs $network
 +
# Required-Stop:    $local_fs
 +
# Default-Start:    2 3 4 5
 +
# Default-Stop:      0 1 6
 +
# Short-Description: Tedds OpenSimulator init.d-script, with further changes by Justin Clark-Casey (http://justincc.org)
 +
### END INIT INFO
 +
 
 +
# Version 0.2.1
 +
# Put script in /etc/init.d/
 +
# Then execute /etc/init.d/opensim <start>|<stop>|<restart>|<status>
 +
#
 +
# You must configure Robust and OpenSim to create Robust.exe.pid and OpenSim.exe.pid PID files
 +
# by configuring PIDFile in the [Startup] section of OpenSim.ini and Robust.ini
 +
 +
set -e
 +
 +
# Location of OpenSimulator binaries
 +
DIR=/opt/opensim/bin
 +
 
 +
# The directory where OpenSimulator and Robust are placing their pid files.  These must be of the form <service-name>.pid
 +
# e.g. OpenSim.exe.pid
 +
PIDDIR=/tmp/
 +
 +
# The user name which will execute the services
 +
USER=opensim
 +
 
 +
SERVICES="Robust.exe OpenSim.exe"
 +
#SERVICES="Robust.exe"
 +
#SERVICES="OpenSim.exe"
 +
 +
#
 +
# Kill values (in seconds)
 +
#
 +
# How long between each service being started
 +
DELAY_STARTUP=10
 +
# How long between each service is sent shutdown command
 +
DELAY_KILL=20
 +
# After shutdown has been sent to all we do another loop with "kill", then "kill -9". How long between "kill" and "kill -9".
 +
DELAY_FORCEKILL=10
 +
 
 +
#
 +
# Info on service handled by this script
 +
 +
# Name of service
 +
NAME=opensim
 +
# Description of service
 +
DESC="OpenSimulator Server"
 +
 +
# Binaries
 +
SCREEN=/usr/bin/screen
 +
MONO=/usr/bin/mono
 +
 +
###########################
 +
##### START OF SCRIPT #####
 +
###########################
 +
 +
export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
 +
 +
# Load LSB log functions
 +
_lsbFile=""
 +
if [ -e /etc/debian_version ]; then
 +
    _lsbFile="/lib/lsb/init-functions"
 +
    if [ -f $_lsbFile ]; then
 +
        . $_lsbFile
 +
    else
 +
        echo "This script requires LSB init-functions file which does not exist: $_lsbFile"
 +
        exit 1
 +
    fi
 +
else
 +
# [ -e /etc/init.d/functions ] ; then
 +
    _lsbFile="/etc/init.d/functions"
 +
    if [ -e $_lsbFile ]; then
 +
        . $_lsbFile
 +
    else
 +
        echo "This script requires LSB init-functions file which does not exist: $_lsbFile"
 +
        exit 1
 +
    fi
 +
fi
 +
 +
# Lets use fancy output
 +
log_use_fancy_output
 +
 +
# Check that target directory exists
 +
if test ! -d "$DIR"; then
 +
    log_failure_msg "$NAME" "Target directory \"$DIR\" does not exist. Can not continue."
 +
    exit 1
 +
fi
 +
 +
# Create a reverse order for shutdown
 +
SERVICES_REVERSE=""
 +
reverse() { SERVICES_REVERSE="$9 $8 $7 $6 $5 $4 $3 $2 $1"; }
 +
reverse $SERVICES
 +
 +
# Check if a service is running
 +
isrunning() {
 +
    ISRUNNING="0"
 +
    # Do we have PID-file?
 +
    if [ -f "$PIDDIR/$1.pid" ]; then
 +
        # Check if proc is running
 +
        pid=`cat "$PIDDIR/$1.pid" 2> /dev/null`
 +
        if [ "$pid" != "" ]; then
 +
            if [ -d /proc/$pid ]; then
 +
                # Process is running
 +
                ISRUNNING="1"
 +
            fi
 +
        fi
 +
    fi
 +
    #ISRUNNING="0"
 +
}
 +
 +
#
 +
# Process commands
 +
#
 +
case "$1" in
 +
start)
 +
    # Start all services one by one
 +
    for server in $SERVICES; do
 +
        log_daemon_msg "Starting $NAME" "$server"
 +
 
 +
        isrunning $server
 +
        case "$ISRUNNING" in
 +
            1) log_daemon_msg "Process already started. Please stop first"; log_end_msg 1 ;;
 +
            0)
 +
                # Process is not running
 +
                # Start process and sleep...
 +
                exefile="/tmp/exe.OpenSim.$server.sh"
 +
 
 +
                # Need to make external file, had big problems with screen params
 +
                echo \#\!/bin/bash > $exefile
 +
                echo cd $DIR >> $exefile
 +
                echo $MONO --debug $server >> $exefile
 +
                chmod +x $exefile
 +
 
 +
                cmd_screen="-S $server -d -m $exefile"
 +
                start-stop-daemon --start --pidfile $PIDDIR/$server.pid -u $USER --chdir $DIR --chuid $USER -x /usr/bin/screen -- $cmd_screen
 +
 
 +
                # Delay between services that are started
 +
                sleep $DELAY_STARTUP
 +
 
 +
                rm $exefile 2> /dev/null
 +
 +
                isrunning $server
 +
                case "$ISRUNNING" in
 +
                    1)
 +
                        # Process started ok
 +
                        #log_daemon_msg "Success";
 +
                        log_end_msg 0
 +
                        ;;
 +
                    0)
 +
                        #log_daemon_msg "Failure";
 +
                        log_end_msg 1
 +
                        ;;
 +
                esac
 +
                ;;
 +
        esac
 +
    done
 +
    ;;
 +
 +
stop)
 +
    _killCount=0
 +
 
 +
    for server in $SERVICES_REVERSE; do
 +
        log_daemon_msg "Stopping $NAME" "$server"
 +
 
 +
        isrunning $server
 +
        case "$ISRUNNING" in
 +
        1)
 +
            _killCount=`expr $_killCount + 1`
 +
            log_daemon_msg "Sending shutdown command:";
 +
 
 +
            cmd_screen="$SCREEN -S $server -p 0 -X stuff quit$(printf \\r)"
 +
 
 +
            # We can't use start-stop-daemon here currently because it will only send a signal to OpenSim
 +
            # --stop doesn't execute a command
 +
            # start-stop-daemon --stop --pidfile $PIDDIR/$server.pid -u $USER --chuid $USER -- $cmd_screen
 +
 
 +
            su $USER -c "$cmd_screen"
 +
 
 +
            # Wait for it to shut down...
 +
            sleep $DELAY_KILL
 +
 
 +
            isrunning $server
 +
            case "$ISRUNNING" in
 +
                1) log_daemon_msg "$server is still running."; log_end_msg 0 ;;
 +
                0) log_daemon_msg "$server has been shutdown"; log_end_msg 0 ;;
 +
            esac
 +
 
 +
            ;;
 +
        0)
 +
            log_daemon_msg "$server is not running"; log_end_msg 0
 +
            ;;
 +
        esac
 +
 
 +
    done
 +
 
 +
    # Check if any procs are still running
 +
    for server in $SERVICES; do
 +
        isrunning $server
 +
        case "$ISRUNNING" in
 +
        1)
 +
            log_warning_msg "Stopping $NAME" "$server is still running: Forcing kill"
 +
            echo `kill $pid 2> /dev/null`;
 +
            sleep $DELAY_FORCEKILL
 +
            echo `kill -9 $pid 2> /dev/null`;
 +
            sleep 1
 +
 
 +
            # Now check again if it is still running...
 +
            isrunning $server
 +
            case "$ISRUNNING" in
 +
                0) log_daemon_msg "Success"; log_end_msg 0 ;;
 +
                1) log_daemon_msg "Process is still running... Even after \"kill -9 $pid\". WOW..."; log_end_msg 0 ;;
 +
            esac
 +
            ;;
 +
        0)
 +
            #log_daemon_msg "";
 +
            ;;
 +
        esac
 +
    done
 +
 
 +
    log_daemon_msg "$NAME: All done (stopped $_killCount processes)"; log_end_msg 0
 +
 
 +
    ;;
 +
 
 +
status)
 +
    # Count how many processes we need
 +
    PROCCOUNT=0
 +
    for i in $SERVICES; do
 +
        PROCCOUNT=`expr $PROCCOUNT + 1`
 +
    done
 +
 
 +
    # Go through server PID files and count how many are running
 +
    log_daemon_msg "$NAME: Running processes:"
 +
    _pidCount=0
 +
    for server in $SERVICES; do
 +
 
 +
        isrunning $server
 +
        case "$ISRUNNING" in
 +
            1)
 +
                # This server is running
 +
                _pidCount=`expr $_pidCount + 1`
 +
                log_daemon_msg "$server"
 +
                ;;
 +
            0)
 +
                ;;
 +
        esac
 +
    done
 +
 
 +
    log_daemon_msg " ($_pidCount of $PROCCOUNT processes are running)"
 +
 
 +
    # Check if running proc count matches requires proc count
 +
    if [ $_pidCount -eq $PROCCOUNT ]; then
 +
        log_daemon_msg "$NAME is running"
 +
        exit 0
 +
    else
 +
        log_daemon_msg "$NAME is NOT running"
 +
        exit 1
 +
    fi
 +
    ;;
 +
 
 +
restart)
 +
    $0 stop
 +
    $0 start
 +
    ;;
 +
*)
 +
    echo "Usage: /etc/init.d/$NAME {start|stop|restart|status}" >&2
 +
    exit 1
 +
    ;;
 +
esac
 +
 
 +
exit 0
 +
</source>
 +
 
 +
== Tedd's Original Script plus clean shutdown tweak ==
 +
 
 +
<source lang="bash">
 +
 
 +
#! /bin/sh
 
  ### BEGIN INIT INFO
 
  ### BEGIN INIT INFO
  # Provides:          OpenSim
+
  # Provides:          OpenSimulator
 
  # Required-Start:    $local_fs $network  
 
  # Required-Start:    $local_fs $network  
 
  # Required-Stop:    $local_fs
 
  # Required-Stop:    $local_fs
 
  # Default-Start:    2 3 4 5
 
  # Default-Start:    2 3 4 5
 
  # Default-Stop:      0 1 6
 
  # Default-Stop:      0 1 6
  # Short-Description: Tedds OpenSim init.d-script
+
  # Short-Description: Tedds OpenSimulator init.d-script
 
  ### END INIT INFO
 
  ### END INIT INFO
 
+
 
  # Put script in /etc/init.d/
 
  # Put script in /etc/init.d/
 
  # then execute: update-rc.d opensim defaults
 
  # then execute: update-rc.d opensim defaults
 
+
 
  set -e
 
  set -e
 
+
 
  #
 
  #
 
  # Directories
 
  # Directories
 
  #
 
  #
  # Location of OpenSim installation
+
  # Location of OpenSimulator installation
 
  DIR=/home/opensim/OpenSim/bin/
 
  DIR=/home/opensim/OpenSim/bin/
 
  # Different PID dir?
 
  # Different PID dir?
 
  PIDDIR=$DIR
 
  PIDDIR=$DIR
 
+
 
  USER=opensim
 
  USER=opensim
  SERVICES="OpenSim.Grid.UserServer.exe OpenSim.Server.exe OpenSim.exe"
+
  SERVICES="Robust.exe OpenSim.exe"
 
+
 
  #
 
  #
 
  # Kill values (in seconds)
 
  # Kill values (in seconds)
Line 52: Line 334:
 
  # After shutdown has been sent to all we do another loop with "kill", then "kill -9". How long between "kill" and "kill -9".
 
  # After shutdown has been sent to all we do another loop with "kill", then "kill -9". How long between "kill" and "kill -9".
 
  DELAY_FORCEKILL=10
 
  DELAY_FORCEKILL=10
 
+
 
  #
 
  #
 
  # Info on service handled by this script
 
  # Info on service handled by this script
#
+
 
  # Name of service
 
  # Name of service
 
  NAME=opensim
 
  NAME=opensim
 
  # Description of service
 
  # Description of service
  DESC="OpenSim Server"
+
  DESC="OpenSimulator Server"
 
+
 
  # Binaries
 
  # Binaries
 
  SCREEN=/usr/bin/screen
 
  SCREEN=/usr/bin/screen
 
  MONO=/usr/bin/mono
 
  MONO=/usr/bin/mono
 
+
 
  ###########################
 
  ###########################
 
  ##### START OF SCRIPT #####
 
  ##### START OF SCRIPT #####
 
  ###########################
 
  ###########################
 
+
 
  export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
 
  export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
 
+
<br>
+
 
 
+
 
  # Load LSB log functions
 
  # Load LSB log functions
 
  _lsbFile=""
 
  _lsbFile=""
Line 80: Line 362:
 
         . $_lsbFile
 
         . $_lsbFile
 
     else
 
     else
         echo This script requires LSB init-functions file which doesn't exist: $_lsbFile
+
         echo "This script requires LSB init-functions file which does not exist: $_lsbFile"
 
         exit 1
 
         exit 1
 
     fi
 
     fi
 
  else
 
  else
  # [ -e /etc/init.d/functions ]&nbsp;; then
+
  # [ -e /etc/init.d/functions ] ; then
 
     _lsbFile="/etc/init.d/functions"
 
     _lsbFile="/etc/init.d/functions"
 
     if [ -e $_lsbFile ]; then
 
     if [ -e $_lsbFile ]; then
 
         . $_lsbFile
 
         . $_lsbFile
 
     else
 
     else
         echo This script requires LSB init-functions file which doesn't exist: $_lsbFile
+
         echo "This script requires LSB init-functions file which does not exist: $_lsbFile"
 
         exit 1
 
         exit 1
 
     fi
 
     fi
 
  fi
 
  fi
 
+
 
  # Lets use fancy output
 
  # Lets use fancy output
 
  log_use_fancy_output
 
  log_use_fancy_output
 
+
 
  # Check that target directory exists
 
  # Check that target directory exists
  if test&nbsp;! -d "$DIR"; then
+
  if test ! -d "$DIR"; then
 
     log_failure_msg "$NAME" "Target directory \"$DIR\" does not exist. Can not continue."
 
     log_failure_msg "$NAME" "Target directory \"$DIR\" does not exist. Can not continue."
 
     exit 1
 
     exit 1
 
  fi
 
  fi
 
+
 
  # Create a reverse order for shutdown
 
  # Create a reverse order for shutdown
 
  SERVICES_REVERSE=""
 
  SERVICES_REVERSE=""
 
  reverse() { SERVICES_REVERSE="$9 $8 $7 $6 $5 $4 $3 $2 $1"; }
 
  reverse() { SERVICES_REVERSE="$9 $8 $7 $6 $5 $4 $3 $2 $1"; }
 
  reverse $SERVICES
 
  reverse $SERVICES
 
+
 
  # Check if a service is running
 
  # Check if a service is running
 
  isrunning() {  
 
  isrunning() {  
Line 114: Line 396:
 
     if [ -f "$PIDDIR/$1.pid" ]; then
 
     if [ -f "$PIDDIR/$1.pid" ]; then
 
         # Check if proc is running
 
         # Check if proc is running
         pid=`cat "$PIDDIR/$1.pid" 2&gt; /dev/null`
+
         pid=`cat "$PIDDIR/$1.pid" 2> /dev/null`
         if [ "$pid"&nbsp;!= "" ]; then
+
         if [ "$pid" != "" ]; then
 
             if [ -d /proc/$pid ]; then
 
             if [ -d /proc/$pid ]; then
 
                 # Process is running
 
                 # Process is running
Line 124: Line 406:
 
     #ISRUNNING="0"
 
     #ISRUNNING="0"
 
  }
 
  }
 
+
 
  #
 
  #
 
  # Process commands
 
  # Process commands
Line 133: Line 415:
 
     for server in $SERVICES; do
 
     for server in $SERVICES; do
 
         log_daemon_msg "Starting $NAME" "$server"
 
         log_daemon_msg "Starting $NAME" "$server"
 
+
 
         isrunning $server
 
         isrunning $server
 
         case "$ISRUNNING" in
 
         case "$ISRUNNING" in
             1) log_progress_msg "Process already started. Please stop first"; log_end_msg 1&nbsp;;;
+
             1) log_progress_msg "Process already started. Please stop first"; log_end_msg 1 ;;
 
             0)  
 
             0)  
 
                 # Process is not running
 
                 # Process is not running
 
                 # Start process and sleep...
 
                 # Start process and sleep...
 
                 exefile="/tmp/exe.OpenSim.$server.sh"
 
                 exefile="/tmp/exe.OpenSim.$server.sh"
 
+
 
                 # Need to make external file, had big problems with screen params
 
                 # Need to make external file, had big problems with screen params
                 echo \#\!/bin/bash &gt; $exefile
+
                 echo \#\!/bin/bash > $exefile
                 echo cd $DIR &gt;&gt; $exefile
+
                 echo cd $DIR >> $exefile
                 echo $MONO $server &gt;&gt; $exefile
+
                 echo $MONO $server >> $exefile
 
                 chmod +x $exefile
 
                 chmod +x $exefile
 
+
 
                 cmd_screen="screen -S $server -d -m $exefile"
 
                 cmd_screen="screen -S $server -d -m $exefile"
 
                 start-stop-daemon --start -b -x /bin/su -m --pidfile=/tmp/su.$server.pid --chdir "$DIR" -- - $USER "-c $cmd_screen"
 
                 start-stop-daemon --start -b -x /bin/su -m --pidfile=/tmp/su.$server.pid --chdir "$DIR" -- - $USER "-c $cmd_screen"
 
+
 
                 # Delay between services that are started
 
                 # Delay between services that are started
 
                 sleep $DELAY_STARTUP
 
                 sleep $DELAY_STARTUP
 
+
                 rm $exefile 2&gt; /dev/null
+
                 rm $exefile 2> /dev/null
 
+
 
                 # Make PID-file
 
                 # Make PID-file
                 ps afxu | grep "mono $server" | grep -iEv "grep|screen" | awk {'print $2'} &gt; "$PIDDIR/$server.pid"
+
                 ps afxu | grep "mono $server" | grep -iEv "grep|screen" | awk {'print $2'} > "$PIDDIR/$server.pid"
 
+
 
                 isrunning $server
 
                 isrunning $server
 
                 case "$ISRUNNING" in
 
                 case "$ISRUNNING" in
Line 165: Line 447:
 
                         #log_progress_msg "Success";  
 
                         #log_progress_msg "Success";  
 
                         log_end_msg 0  
 
                         log_end_msg 0  
                        &nbsp;;;
+
                        ;;
 
                     0)  
 
                     0)  
                         # Process didn't start... remove pid-file
+
                         # Process did not start... remove pid-file
                         rm "$PIDDIR/$server.pid" 2&gt; /dev/null
+
                         rm "$PIDDIR/$server.pid" 2> /dev/null
 
                         #log_progress_msg "Failure";  
 
                         #log_progress_msg "Failure";  
 
                         log_end_msg 1  
 
                         log_end_msg 1  
                        &nbsp;;;
+
                        ;;
 
                 esac
 
                 esac
                &nbsp;;;
+
                ;;
 
         esac
 
         esac
 
+
 
     done
 
     done
    &nbsp;;;
+
    ;;
 
+
<br>
+
 
 
+
 
  stop)
 
  stop)
 
     _killCount=0
 
     _killCount=0
 
+
 
     for server in $SERVICES_REVERSE; do
 
     for server in $SERVICES_REVERSE; do
 
         log_daemon_msg "Stopping $NAME" "$server"
 
         log_daemon_msg "Stopping $NAME" "$server"
 
+
 
         isrunning $server
 
         isrunning $server
 
         case "$ISRUNNING" in
 
         case "$ISRUNNING" in
Line 192: Line 474:
 
             _killCount=`expr $_killCount + 1`
 
             _killCount=`expr $_killCount + 1`
 
             log_progress_msg "Sending shutdown command:";  
 
             log_progress_msg "Sending shutdown command:";  
 
+
             # We add some backspaces to the command in case something is on the console already
+
             cmd_screen="screen -S $server -p 0 -X stuff quit$(printf \\r)"
            echo `screen -S $server -X stuff \"                            
+
            su $USER -c "$cmd_screen"
 
+
 
             # Wait for it to shut down...
 
             # Wait for it to shut down...
 
             sleep $DELAY_KILL
 
             sleep $DELAY_KILL
 
+
 
             isrunning $server
 
             isrunning $server
 
             case "$ISRUNNING" in
 
             case "$ISRUNNING" in
                 1) log_progress_msg "is still running."; log_end_msg 0&nbsp;;;
+
                 1) log_progress_msg "is still running."; log_end_msg 0 ;;
                 0) log_progress_msg "has been shutdown"; log_end_msg 0&nbsp;;;
+
                 0) log_progress_msg "has been shutdown"; log_end_msg 0 ;;
 
             esac
 
             esac
 
+
            &nbsp;;;
+
            ;;
 
         0)  
 
         0)  
 
             log_progress_msg "is not running"; log_end_msg 0
 
             log_progress_msg "is not running"; log_end_msg 0
            &nbsp;;;
+
            ;;
 
         esac
 
         esac
 
+
 
     done
 
     done
 
+
 
     # Check if any procs are still running
 
     # Check if any procs are still running
 
     for server in $SERVICES; do
 
     for server in $SERVICES; do
Line 219: Line 501:
 
         1)  
 
         1)  
 
             log_warning_msg "Stopping $NAME" "$server is still running: Forcing kill"
 
             log_warning_msg "Stopping $NAME" "$server is still running: Forcing kill"
             echo `kill $pid 2&gt; /dev/null`;
+
             echo `kill $pid 2> /dev/null`;
 
             sleep $DELAY_FORCEKILL
 
             sleep $DELAY_FORCEKILL
             echo `kill -9 $pid 2&gt; /dev/null`;
+
             echo `kill -9 $pid 2> /dev/null`;
 
             sleep 1
 
             sleep 1
 
+
 
             # Now check again if it is still running...
 
             # Now check again if it is still running...
 
             isrunning $server
 
             isrunning $server
 
             case "$ISRUNNING" in
 
             case "$ISRUNNING" in
                 0) log_progress_msg "Success"; log_end_msg 0&nbsp;;;
+
                 0) log_progress_msg "Success"; log_end_msg 0 ;;
                 1) log_progress_msg "Process is still running... Even after \"kill -9 $pid\". WOW..."; log_end_msg 0&nbsp;;;
+
                 1) log_progress_msg "Process is still running... Even after \"kill -9 $pid\". WOW..."; log_end_msg 0 ;;
 
             esac
 
             esac
            &nbsp;;;
+
            ;;
 
         0)  
 
         0)  
 
             #log_progress_msg "";  
 
             #log_progress_msg "";  
            &nbsp;;;
+
            ;;
 
         esac
 
         esac
 
     done
 
     done
 
+
 
     log_begin_msg "$NAME: All done (killed $_killCount procs)"; log_end_msg 0
 
     log_begin_msg "$NAME: All done (killed $_killCount procs)"; log_end_msg 0
 
+
    &nbsp;;;
+
    ;;
 
+
<br>
+
 
 
+
<br>
+
 
 
+
 
  status)
 
  status)
 
     # Count how many processes we need
 
     # Count how many processes we need
Line 251: Line 533:
 
         PROCCOUNT=`expr $PROCCOUNT + 1`
 
         PROCCOUNT=`expr $PROCCOUNT + 1`
 
     done
 
     done
 
+
 
     # Go through server PID files and count how many are running
 
     # Go through server PID files and count how many are running
 
     log_begin_msg "$NAME: Running processed:"
 
     log_begin_msg "$NAME: Running processed:"
 
     _pidCount=0
 
     _pidCount=0
 
     for server in $SERVICES; do
 
     for server in $SERVICES; do
 
+
 
         isrunning $server
 
         isrunning $server
 
         case "$ISRUNNING" in
 
         case "$ISRUNNING" in
Line 263: Line 545:
 
                 _pidCount=`expr $_pidCount + 1`
 
                 _pidCount=`expr $_pidCount + 1`
 
                 log_progress_msg "$server"
 
                 log_progress_msg "$server"
                &nbsp;;;
+
                ;;
 
             0)  
 
             0)  
                &nbsp;;;
+
                ;;
 
         esac
 
         esac
 
     done
 
     done
 
+
 
     log_begin_msg " ($_pidCount of $PROCCOUNT processes are running)"; log_end_msg 0
 
     log_begin_msg " ($_pidCount of $PROCCOUNT processes are running)"; log_end_msg 0
 
+
 
     # Check if running proc count matches requires proc count
 
     # Check if running proc count matches requires proc count
 
     log_begin_msg "$NAME is"
 
     log_begin_msg "$NAME is"
Line 280: Line 562:
 
         exit 1
 
         exit 1
 
     fi
 
     fi
    &nbsp;;;
+
    ;;
 
+
 
  restart)
 
  restart)
 
     $0 stop
 
     $0 stop
 
     $0 start
 
     $0 start
    &nbsp;;;
+
    ;;
 
  *)
 
  *)
     echo "Usage: /etc/init.d/$NAME {start|stop|restart|status}" &gt;&amp;2
+
     echo "Usage: /etc/init.d/$NAME {start|stop|restart|status}" >&2
 
     exit 1
 
     exit 1
    &nbsp;;;
+
    ;;
 
  esac
 
  esac
 
+
 
  exit 0
 
  exit 0
 +
</source>
 +
 +
 +
== Init script for RHEL Based system  ==
 +
 +
 +
<source lang="bash">
 +
 +
#!/bin/bash
 +
#
 +
# OpenSim      OpenSim
 +
# author neowdj
 +
# date            20131222
 +
# version        0.1
 +
 +
# chkconfig: 2345 80 30
 +
# description: OpenSim Server
 +
# processname: mono
 +
 +
. /etc/rc.d/init.d/functions
 +
 +
#BIN dir
 +
dir="/opt/opensim/bin/"
 +
# Robust or OpenSim
 +
prog="Robust"
 +
#Launch program with the user opensim
 +
user="opensim"
 +
 +
 +
CMD="su $user -c 'screen -dmS $prog mono --server $prog.exe'"
 +
RUNNING=`ps -e | grep mono | wc -l`
 +
SUBSYS="/var/lock/subsys/mono"
 +
PIDFILE="/var/run/OpenSim/$prog.pid"
 +
OPENSIM_TIMEOUT="100"
 +
 +
start() {
 +
    if [ "$RUNNING" -eq 1 ]; then
 +
    echo -n $"Starting $prog: "
 +
                RETVAL=$?
 +
                echo
 +
 +
else
 +
cd $dir
 +
echo -n $"Starting $prog: "
 +
                daemon $CMD
 +
        RETVAL=$?
 +
        echo
 +
        [ $RETVAL -eq 0 ] && touch $SUBSYS || \
 +
          RETVAL=1
 +
return $RETVAL
 +
fi
 +
 +
}
 +
 +
stop() {
 +
echo -n $"Stopping $prog: "
 +
                        su $user -c "screen -S $prog -p 0 -X stuff quit$(printf \\r)" 2>&1
 +
        RETVAL=$?
 +
if [ $RETVAL -eq 0 ] ; then
 +
rm -f $SUBSYS
 +
timeout=0
 +
                while : ; do
 +
                        [ -f $PIDFILE ] || break
 +
                        if [ $timeout -ge $OPENSIM_TIMEOUT ]; then
 +
                                echo
 +
                                return 1
 +
                        fi
 +
                        sleep 2 && echo -n "."
 +
                        timeout=$((timeout+2))
 +
                done
 +
                echo_success
 +
                echo
 +
        else
 +
                echo_failure
 +
                echo
 +
        fi
 +
        return $RETVAL
 +
 +
}
 +
 +
statusos() {
 +
        status -p $PIDFILE $prog
 +
        exit 1
 +
}
 +
 +
case "$1" in
 +
  start)
 +
        start
 +
        ;;
 +
  stop)
 +
        stop
 +
        ;;
 +
  restart)
 +
stop
 +
start
 +
;;
 +
  status)
 +
        statusos
 +
        ;;
 +
  *)
 +
        echo "Usage: $0 {start|stop|restart|status}"
 +
esac
 +
exit $?
 +
</source>

Revision as of 12:58, 29 January 2014

Contents

/etc/init.d script for Linux

Instructions

Tested on Debian 5. CHUIDS user to opensim user. Supports: start, stop, restart, status

To implement: Type: cat > /etc/init.d/opensim Paste in script from this page Press: CTRL+D Type: chmod +x /etc/init.d/opensim Script should now be located on server and be executable.

Modify header in script to adapt it to your installation folder and user.

Updated script

Unlike Tedd's original script below, this relies on OpenSimulator's own PID functionality to work, so you must uncomment the PIDFile entries in the [Startup] section of OpenSim.ini/Robust.ini and set them to /tmp/OpenSim.exe.pid and /tmp/Robust.exe.pid as appropriate.

This allows us to simplify the script and get better error reporting. Cleanly shutting down OpenSimulator has also been implemented.

The delay between attempting clean shutdown and force shutting down has been doubled to 20 seconds. However, in some cases this still might not be enough. In the future, it would be better to poll for status.

This script is maintained at https://github.com/justincc/opensimulator-tools/blob/master/infrastructure/control/init.d/src/opensim Pull requests welcome!

#! /bin/sh
### BEGIN INIT INFO
# Provides:          OpenSimulator
# Required-Start:    $local_fs $network 
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Tedds OpenSimulator init.d-script, with further changes by Justin Clark-Casey (http://justincc.org)
### END INIT INFO
 
# Version 0.2.1
# Put script in /etc/init.d/
# Then execute /etc/init.d/opensim <start>|<stop>|<restart>|<status>
#
# You must configure Robust and OpenSim to create Robust.exe.pid and OpenSim.exe.pid PID files
# by configuring PIDFile in the [Startup] section of OpenSim.ini and Robust.ini
 
set -e
 
# Location of OpenSimulator binaries
DIR=/opt/opensim/bin
 
# The directory where OpenSimulator and Robust are placing their pid files.  These must be of the form <service-name>.pid
# e.g. OpenSim.exe.pid
PIDDIR=/tmp/
 
# The user name which will execute the services
USER=opensim
 
SERVICES="Robust.exe OpenSim.exe"
#SERVICES="Robust.exe"
#SERVICES="OpenSim.exe"
 
#
# Kill values (in seconds)
#
# How long between each service being started
DELAY_STARTUP=10
# How long between each service is sent shutdown command
DELAY_KILL=20
# After shutdown has been sent to all we do another loop with "kill", then "kill -9". How long between "kill" and "kill -9".
DELAY_FORCEKILL=10
 
#
# Info on service handled by this script
 
# Name of service
NAME=opensim
# Description of service
DESC="OpenSimulator Server"
 
# Binaries
SCREEN=/usr/bin/screen
MONO=/usr/bin/mono
 
###########################
##### START OF SCRIPT #####
###########################
 
export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
 
# Load LSB log functions
_lsbFile=""
if [ -e /etc/debian_version ]; then
    _lsbFile="/lib/lsb/init-functions"
    if [ -f $_lsbFile ]; then
        . $_lsbFile
    else
        echo "This script requires LSB init-functions file which does not exist: $_lsbFile"
        exit 1
    fi
else
# [ -e /etc/init.d/functions ] ; then
    _lsbFile="/etc/init.d/functions"
    if [ -e $_lsbFile ]; then
        . $_lsbFile
    else
        echo "This script requires LSB init-functions file which does not exist: $_lsbFile"
        exit 1
    fi
fi
 
# Lets use fancy output
log_use_fancy_output
 
# Check that target directory exists
if test ! -d "$DIR"; then
    log_failure_msg "$NAME" "Target directory \"$DIR\" does not exist. Can not continue."
    exit 1
fi
 
# Create a reverse order for shutdown
SERVICES_REVERSE=""
reverse() { SERVICES_REVERSE="$9 $8 $7 $6 $5 $4 $3 $2 $1"; }
reverse $SERVICES
 
# Check if a service is running
isrunning() { 
    ISRUNNING="0"
    # Do we have PID-file?
    if [ -f "$PIDDIR/$1.pid" ]; then
        # Check if proc is running
        pid=`cat "$PIDDIR/$1.pid" 2> /dev/null`
        if [ "$pid" != "" ]; then
            if [ -d /proc/$pid ]; then
                # Process is running
                ISRUNNING="1"
            fi
        fi
    fi
    #ISRUNNING="0"
}
 
#
# Process commands
#
case "$1" in
start)
    # Start all services one by one
    for server in $SERVICES; do
        log_daemon_msg "Starting $NAME" "$server"
 
        isrunning $server
        case "$ISRUNNING" in
            1) log_daemon_msg "Process already started. Please stop first"; log_end_msg 1 ;;
            0) 
                # Process is not running
                # Start process and sleep...
                exefile="/tmp/exe.OpenSim.$server.sh"
 
                # Need to make external file, had big problems with screen params
                echo \#\!/bin/bash > $exefile
                echo cd $DIR >> $exefile
                echo $MONO --debug $server >> $exefile
                chmod +x $exefile
 
                cmd_screen="-S $server -d -m $exefile"
                start-stop-daemon --start --pidfile $PIDDIR/$server.pid -u $USER --chdir $DIR --chuid $USER -x /usr/bin/screen -- $cmd_screen
 
                # Delay between services that are started
                sleep $DELAY_STARTUP
 
                rm $exefile 2> /dev/null
 
                isrunning $server
                case "$ISRUNNING" in
                    1) 
                        # Process started ok
                        #log_daemon_msg "Success"; 
                        log_end_msg 0 
                        ;;
                    0) 
                        #log_daemon_msg "Failure"; 
                        log_end_msg 1 
                        ;;
                esac
                ;;
        esac
    done
    ;;
 
stop)
    _killCount=0
 
    for server in $SERVICES_REVERSE; do
        log_daemon_msg "Stopping $NAME" "$server"
 
        isrunning $server
        case "$ISRUNNING" in
        1) 
            _killCount=`expr $_killCount + 1`
            log_daemon_msg "Sending shutdown command:"; 
 
            cmd_screen="$SCREEN -S $server -p 0 -X stuff quit$(printf \\r)"
 
            # We can't use start-stop-daemon here currently because it will only send a signal to OpenSim
            # --stop doesn't execute a command
            # start-stop-daemon --stop --pidfile $PIDDIR/$server.pid -u $USER --chuid $USER -- $cmd_screen
 
            su $USER -c "$cmd_screen"
 
            # Wait for it to shut down...
            sleep $DELAY_KILL
 
            isrunning $server
            case "$ISRUNNING" in
                1) log_daemon_msg "$server is still running."; log_end_msg 0 ;;
                0) log_daemon_msg "$server has been shutdown"; log_end_msg 0 ;;
            esac
 
            ;;
        0) 
            log_daemon_msg "$server is not running"; log_end_msg 0
            ;;
        esac
 
    done
 
    # Check if any procs are still running
    for server in $SERVICES; do
        isrunning $server
        case "$ISRUNNING" in
        1) 
            log_warning_msg "Stopping $NAME" "$server is still running: Forcing kill"
            echo `kill $pid 2> /dev/null`;
            sleep $DELAY_FORCEKILL
            echo `kill -9 $pid 2> /dev/null`;
            sleep 1
 
            # Now check again if it is still running...
            isrunning $server
            case "$ISRUNNING" in
                0) log_daemon_msg "Success"; log_end_msg 0 ;;
                1) log_daemon_msg "Process is still running... Even after \"kill -9 $pid\". WOW..."; log_end_msg 0 ;;
            esac
            ;;
        0) 
            #log_daemon_msg ""; 
            ;;
        esac
    done
 
    log_daemon_msg "$NAME: All done (stopped $_killCount processes)"; log_end_msg 0
 
    ;;
 
status)
    # Count how many processes we need
    PROCCOUNT=0
    for i in $SERVICES; do
        PROCCOUNT=`expr $PROCCOUNT + 1`
    done
 
    # Go through server PID files and count how many are running
    log_daemon_msg "$NAME: Running processes:"
    _pidCount=0
    for server in $SERVICES; do
 
        isrunning $server
        case "$ISRUNNING" in
            1) 
                # This server is running
                _pidCount=`expr $_pidCount + 1`
                log_daemon_msg "$server"
                ;;
            0) 
                ;;
        esac
    done
 
    log_daemon_msg " ($_pidCount of $PROCCOUNT processes are running)"
 
    # Check if running proc count matches requires proc count
    if [ $_pidCount -eq $PROCCOUNT ]; then
        log_daemon_msg "$NAME is running"
        exit 0
    else
        log_daemon_msg "$NAME is NOT running"
        exit 1
    fi
    ;;
 
restart)
    $0 stop
    $0 start
    ;;
*)
    echo "Usage: /etc/init.d/$NAME {start|stop|restart|status}" >&2
    exit 1
    ;;
esac
 
exit 0

Tedd's Original Script plus clean shutdown tweak

#! /bin/sh
 ### BEGIN INIT INFO
 # Provides:          OpenSimulator
 # Required-Start:    $local_fs $network 
 # Required-Stop:     $local_fs
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Tedds OpenSimulator init.d-script
 ### END INIT INFO
 
 # Put script in /etc/init.d/
 # then execute: update-rc.d opensim defaults
 
 set -e
 
 #
 # Directories
 #
 # Location of OpenSimulator installation
 DIR=/home/opensim/OpenSim/bin/
 # Different PID dir?
 PIDDIR=$DIR
 
 USER=opensim
 SERVICES="Robust.exe OpenSim.exe"
 
 #
 # Kill values (in seconds)
 #
 # How long between each service being started
 DELAY_STARTUP=10
 # How long between each service is sent shutdown command
 DELAY_KILL=10
 # After shutdown has been sent to all we do another loop with "kill", then "kill -9". How long between "kill" and "kill -9".
 DELAY_FORCEKILL=10
 
 #
 # Info on service handled by this script
 
 # Name of service
 NAME=opensim
 # Description of service
 DESC="OpenSimulator Server"
 
 # Binaries
 SCREEN=/usr/bin/screen
 MONO=/usr/bin/mono
 
 ###########################
 ##### START OF SCRIPT #####
 ###########################
 
 export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
 
 
 
 # Load LSB log functions
 _lsbFile=""
 if [ -e /etc/debian_version ]; then
     _lsbFile="/lib/lsb/init-functions"
     if [ -f $_lsbFile ]; then
         . $_lsbFile
     else
         echo "This script requires LSB init-functions file which does not exist: $_lsbFile"
         exit 1
     fi
 else
 # [ -e /etc/init.d/functions ] ; then
     _lsbFile="/etc/init.d/functions"
     if [ -e $_lsbFile ]; then
         . $_lsbFile
     else
         echo "This script requires LSB init-functions file which does not exist: $_lsbFile"
         exit 1
     fi
 fi
 
 # Lets use fancy output
 log_use_fancy_output
 
 # Check that target directory exists
 if test ! -d "$DIR"; then
     log_failure_msg "$NAME" "Target directory \"$DIR\" does not exist. Can not continue."
     exit 1
 fi
 
 # Create a reverse order for shutdown
 SERVICES_REVERSE=""
 reverse() { SERVICES_REVERSE="$9 $8 $7 $6 $5 $4 $3 $2 $1"; }
 reverse $SERVICES
 
 # Check if a service is running
 isrunning() { 
     ISRUNNING="0"
     # Do we have PID-file?
     if [ -f "$PIDDIR/$1.pid" ]; then
         # Check if proc is running
         pid=`cat "$PIDDIR/$1.pid" 2> /dev/null`
         if [ "$pid" != "" ]; then
             if [ -d /proc/$pid ]; then
                 # Process is running
                 ISRUNNING="1"
             fi
         fi
     fi
     #ISRUNNING="0"
 }
 
 #
 # Process commands
 #
 case "$1" in
 start)
     # Start all services one by one
     for server in $SERVICES; do
         log_daemon_msg "Starting $NAME" "$server"
 
         isrunning $server
         case "$ISRUNNING" in
             1) log_progress_msg "Process already started. Please stop first"; log_end_msg 1 ;;
             0) 
                 # Process is not running
                 # Start process and sleep...
                 exefile="/tmp/exe.OpenSim.$server.sh"
 
                 # Need to make external file, had big problems with screen params
                 echo \#\!/bin/bash > $exefile
                 echo cd $DIR >> $exefile
                 echo $MONO $server >> $exefile
                 chmod +x $exefile
 
                 cmd_screen="screen -S $server -d -m $exefile"
                 start-stop-daemon --start -b -x /bin/su -m --pidfile=/tmp/su.$server.pid --chdir "$DIR" -- - $USER "-c $cmd_screen"
 
                 # Delay between services that are started
                 sleep $DELAY_STARTUP
 
                 rm $exefile 2> /dev/null
 
                 # Make PID-file
                 ps afxu | grep "mono $server" | grep -iEv "grep|screen" | awk {'print $2'} > "$PIDDIR/$server.pid"
 
                 isrunning $server
                 case "$ISRUNNING" in
                     1) 
                         # Process started ok
                         #log_progress_msg "Success"; 
                         log_end_msg 0 
                         ;;
                     0) 
                         # Process did not start... remove pid-file
                         rm "$PIDDIR/$server.pid" 2> /dev/null
                         #log_progress_msg "Failure"; 
                         log_end_msg 1 
                         ;;
                 esac
                 ;;
         esac
 
     done
     ;;
 
 
 
 stop)
     _killCount=0
 
     for server in $SERVICES_REVERSE; do
         log_daemon_msg "Stopping $NAME" "$server"
 
         isrunning $server
         case "$ISRUNNING" in
         1) 
             _killCount=`expr $_killCount + 1`
             log_progress_msg "Sending shutdown command:"; 
 
             cmd_screen="screen -S $server -p 0 -X stuff quit$(printf \\r)"
             su $USER -c "$cmd_screen"
 
             # Wait for it to shut down...
             sleep $DELAY_KILL
 
             isrunning $server
             case "$ISRUNNING" in
                 1) log_progress_msg "is still running."; log_end_msg 0 ;;
                 0) log_progress_msg "has been shutdown"; log_end_msg 0 ;;
             esac
 
             ;;
         0) 
             log_progress_msg "is not running"; log_end_msg 0
             ;;
         esac
 
     done
 
     # Check if any procs are still running
     for server in $SERVICES; do
         isrunning $server
         case "$ISRUNNING" in
         1) 
             log_warning_msg "Stopping $NAME" "$server is still running: Forcing kill"
             echo `kill $pid 2> /dev/null`;
             sleep $DELAY_FORCEKILL
             echo `kill -9 $pid 2> /dev/null`;
             sleep 1
 
             # Now check again if it is still running...
             isrunning $server
             case "$ISRUNNING" in
                 0) log_progress_msg "Success"; log_end_msg 0 ;;
                 1) log_progress_msg "Process is still running... Even after \"kill -9 $pid\". WOW..."; log_end_msg 0 ;;
             esac
             ;;
         0) 
             #log_progress_msg ""; 
             ;;
         esac
     done
 
     log_begin_msg "$NAME: All done (killed $_killCount procs)"; log_end_msg 0
 
     ;;
 
 
 
 
 
 status)
     # Count how many processes we need
     PROCCOUNT=0
     for i in $SERVICES; do
         PROCCOUNT=`expr $PROCCOUNT + 1`
     done
 
     # Go through server PID files and count how many are running
     log_begin_msg "$NAME: Running processed:"
     _pidCount=0
     for server in $SERVICES; do
 
         isrunning $server
         case "$ISRUNNING" in
             1) 
                 # This server is running
                 _pidCount=`expr $_pidCount + 1`
                 log_progress_msg "$server"
                 ;;
             0) 
                 ;;
         esac
     done
 
     log_begin_msg " ($_pidCount of $PROCCOUNT processes are running)"; log_end_msg 0
 
     # Check if running proc count matches requires proc count
     log_begin_msg "$NAME is"
     if [ $_pidCount -eq $PROCCOUNT ]; then
         log_progress_msg "running"; log_end_msg 0
         exit 0
     else
         log_progress_msg "NOT running"; log_end_msg 0
         exit 1
     fi
     ;;
 
 restart)
     $0 stop
     $0 start
     ;;
 *)
     echo "Usage: /etc/init.d/$NAME {start|stop|restart|status}" >&2
     exit 1
     ;;
 esac
 
 exit 0


Init script for RHEL Based system

#!/bin/bash
#
# OpenSim      OpenSim
# author		 neowdj
# date            20131222
# version         0.1
 
# chkconfig: 2345 80 30
# description: OpenSim Server
# processname: mono
 
. /etc/rc.d/init.d/functions
 
#BIN dir
dir="/opt/opensim/bin/"
# Robust or OpenSim
prog="Robust"
#Launch program with the user opensim 
user="opensim"
 
 
CMD="su $user -c 'screen -dmS $prog mono --server $prog.exe'"
RUNNING=`ps -e | grep mono | wc -l`
SUBSYS="/var/lock/subsys/mono"
PIDFILE="/var/run/OpenSim/$prog.pid"
OPENSIM_TIMEOUT="100"
 
start() {
    	if [ "$RUNNING" -eq 1 ]; then
     		echo -n $"Starting $prog: "
                RETVAL=$?
                echo
 
	else
		cd $dir
		echo -n $"Starting $prog: "
                daemon $CMD
        	RETVAL=$?
        	echo
        	[ $RETVAL -eq 0 ] && touch $SUBSYS || \
           		RETVAL=1
		return $RETVAL
	fi
 
}
 
stop() {
			echo -n $"Stopping $prog: "
                        su $user -c "screen -S $prog -p 0 -X stuff quit$(printf \\r)" 2>&1
        		RETVAL=$?
			if [ $RETVAL -eq 0 ] ; then
			rm -f $SUBSYS
			timeout=0
	                while : ; do
                        [ -f $PIDFILE ] || break
                        if [ $timeout -ge $OPENSIM_TIMEOUT ]; then
                                echo
                                return 1
                        fi
                        sleep 2 && echo -n "."
                        timeout=$((timeout+2))
                	done
                	echo_success
                	echo
        	else
                	echo_failure
                	echo
        	fi
        return $RETVAL
 
}	
 
statusos() {
        status -p $PIDFILE $prog
        exit 1
}
 
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
	stop
	start
	;;
  status)
        statusos
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status}"
esac
exit $?
Personal tools
General
About This Wiki