Startup script linux
From OpenSimulator
m (Robot: Replacing 'OpenSim' to 'OpenSimulator', which is the precise name)  | 
			Frankenputer  (Talk | contribs)  m (→Script)  | 
			||
| Line 34: | Line 34: | ||
<source lang="bash">  | <source lang="bash">  | ||
| − | + | #! /bin/sh  | |
  ### BEGIN INIT INFO  |   ### BEGIN INIT INFO  | ||
  # Provides:          OpenSimulator  |   # Provides:          OpenSimulator  | ||
| Line 43: | Line 43: | ||
  # Short-Description: Tedds OpenSimulator 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  | ||
| Line 56: | Line 56: | ||
  # Different PID dir?  |   # Different PID dir?  | ||
  PIDDIR=$DIR  |   PIDDIR=$DIR  | ||
| − | + | ||
  USER=opensim  |   USER=opensim  | ||
| − |   SERVICES="  | + |   SERVICES="Robust.exe OpenSim.exe"  | 
| − | + | ||
  #  |   #  | ||
  # Kill values (in seconds)  |   # Kill values (in seconds)  | ||
| Line 69: | Line 69: | ||
  # 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="OpenSimulator 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"  | ||
| − | + | ||
| − | + | ||
| − | + | ||
  # Load LSB log functions  |   # Load LSB log functions  | ||
  _lsbFile=""  |   _lsbFile=""  | ||
| Line 101: | Line 101: | ||
      fi  |       fi  | ||
  else  |   else  | ||
| − |   # [ -e /etc/init.d/functions ]  | + |   # [ -e /etc/init.d/functions ] ; then  | 
      _lsbFile="/etc/init.d/functions"  |       _lsbFile="/etc/init.d/functions"  | ||
      if [ -e $_lsbFile ]; then  |       if [ -e $_lsbFile ]; then  | ||
| Line 110: | Line 110: | ||
      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  | + |   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 131: | Line 131: | ||
      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  | + |           pid=`cat "$PIDDIR/$1.pid" 2> /dev/null`  | 
| − |           if [ "$pid"  | + |           if [ "$pid" != "" ]; then  | 
              if [ -d /proc/$pid ]; then  |               if [ -d /proc/$pid ]; then  | ||
                  # Process is running  |                   # Process is running  | ||
| Line 141: | Line 141: | ||
      #ISRUNNING="0"  |       #ISRUNNING="0"  | ||
  }  |   }  | ||
| − | + | ||
  #  |   #  | ||
  # Process commands  |   # Process commands  | ||
| Line 150: | Line 150: | ||
      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  | + |               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   | + |                   echo \#\!/bin/bash > $exefile  | 
| − |                   echo cd $DIR   | + |                   echo cd $DIR >> $exefile  | 
| − |                   echo $MONO $server   | + |                   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  | + |                   rm $exefile 2> /dev/null  | 
| − | + | ||
                  # Make PID-file  |                   # Make PID-file  | ||
| − |                   ps afxu | grep "mono $server" | grep -iEv "grep|screen" | awk {'print $2'}   | + |                   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 182: | Line 182: | ||
                          #log_progress_msg "Success";    |                           #log_progress_msg "Success";    | ||
                          log_end_msg 0    |                           log_end_msg 0    | ||
| − | + |                          ;;  | |
                      0)    |                       0)    | ||
                          # Process did not start... remove pid-file  |                           # Process did not start... remove pid-file  | ||
| − |                           rm "$PIDDIR/$server.pid" 2  | + |                           rm "$PIDDIR/$server.pid" 2> /dev/null  | 
                          #log_progress_msg "Failure";    |                           #log_progress_msg "Failure";    | ||
                          log_end_msg 1    |                           log_end_msg 1    | ||
| − | + |                          ;;  | |
                  esac  |                   esac  | ||
| − | + |                  ;;  | |
          esac  |           esac  | ||
| − | + | ||
      done  |       done  | ||
| − | + |      ;;  | |
| − | + | ||
| − | + | ||
| − | + | ||
  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 209: | Line 209: | ||
              _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  |               # We add some backspaces to the command in case something is on the console already  | ||
              echo "screen -S $server -X stuff"                                |               echo "screen -S $server -X stuff"                                | ||
| − | + | ||
              # 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  | + |                   1) log_progress_msg "is still running."; log_end_msg 0 ;;  | 
| − |                   0) log_progress_msg "has been shutdown"; log_end_msg 0  | + |                   0) log_progress_msg "has been shutdown"; log_end_msg 0 ;;  | 
              esac  |               esac  | ||
| − | + | ||
| − | + |              ;;  | |
          0)    |           0)    | ||
              log_progress_msg "is not running"; log_end_msg 0  |               log_progress_msg "is not running"; log_end_msg 0  | ||
| − | + |              ;;  | |
          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 236: | Line 236: | ||
          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  | + |               echo `kill $pid 2> /dev/null`;  | 
              sleep $DELAY_FORCEKILL  |               sleep $DELAY_FORCEKILL  | ||
| − |               echo `kill -9 $pid 2  | + |               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  | + |                   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  | + |                   1) log_progress_msg "Process is still running... Even after \"kill -9 $pid\". WOW..."; log_end_msg 0 ;;  | 
              esac  |               esac  | ||
| − | + |              ;;  | |
          0)    |           0)    | ||
              #log_progress_msg "";    |               #log_progress_msg "";    | ||
| − | + |              ;;  | |
          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  | ||
| − | + | ||
| − | + |      ;;  | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
  status)  |   status)  | ||
      # Count how many processes we need  |       # Count how many processes we need  | ||
| Line 268: | Line 268: | ||
          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 280: | Line 280: | ||
                  _pidCount=`expr $_pidCount + 1`  |                   _pidCount=`expr $_pidCount + 1`  | ||
                  log_progress_msg "$server"  |                   log_progress_msg "$server"  | ||
| − | + |                  ;;  | |
              0)    |               0)    | ||
| − | + |                  ;;  | |
          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 297: | Line 297: | ||
          exit 1  |           exit 1  | ||
      fi  |       fi  | ||
| − | + |      ;;  | |
| − | + | ||
  restart)  |   restart)  | ||
      $0 stop  |       $0 stop  | ||
      $0 start  |       $0 start  | ||
| − | + |      ;;  | |
  *)  |   *)  | ||
| − |       echo "Usage: /etc/init.d/$NAME {start|stop|restart|status}" &  | + |       echo "Usage: /etc/init.d/$NAME {start|stop|restart|status}" >&2  | 
      exit 1  |       exit 1  | ||
| − | + |      ;;  | |
  esac  |   esac  | ||
| − | + | ||
  exit 0  |   exit 0  | ||
</source>  | </source>  | ||
Revision as of 21:15, 20 March 2012
Contents | 
Simple Standalone Sim Startup Script
Instructions
This script assumes that you will start the sim whenever you are using it.
The sim will run as a job in its own terminal.
To shutdown the sim you enter the SHUTDOWN command at the terminal prompt.
Script
#! /bin/sh cd /home/opensim/diva-r11766/bin export MONO_THREADS_PER_CPU=125 mono OpenSim.exe
Grid Mode /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.
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.
NOTE: stop-command currently doesn't work properly (it doesn't do a soft shutdown). It will kill OpenSimulator first with kill pid, then kill -9 pid. So make sure you have saved your data. :)
Script
#! /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:"; # We add some backspaces to the command in case something is on the console already echo "screen -S $server -X stuff" # 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