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