Merge branch 'master' of feistymeow.org:feisty_meow
[feisty_meow.git] / scripts / opensim / opensim_utils.sh
1 #!/bin/bash
2 # this is a collection of scripts that assist in managing an opensim server.
3 # it uses the "screen" utility to manage opensimulator instances.
4
5 source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
6
7 # set up some parameters that we believe (or have been told) are beneficial.
8 export MONO_THREADS_PER_CPU=1208
9
10 # we run the processes with a little cpu de-prioritization.  we do not want
11 # them taking over completely if there's a runaway mono tornado.
12 export NICENESS_LEVEL=6
13
14 # a tip that supposedly helps on linux so that there won't be bizarre
15 # problems compiling scripts.
16 export LANG=C
17
18 # this is used as a process startup snooze, to avoid running a dependent
19 # process before the dependency has really started.
20 export SNOOZE_TIME=6
21
22 # lock the limit in for threads, so we don't have any getting out of control.
23 # also make sure we've provided enough space for each thread.
24 ulimit -s 512144
25
26 # use more recent versions of mono for opensim if they're available.
27 if [ -d /opt/mono-2.10/bin ]; then
28   export PATH=/opt/mono-2.10/bin:$PATH
29 elif [ -d /opt/mono-2.8/bin ]; then
30   # use version 2.8 mono for opensim if it's available.
31   export PATH=/opt/mono-2.8/bin:$PATH
32 fi
33
34 function launch_screen()
35 {
36   screen_name="$1"; shift
37   app_name="$1"; shift
38   echo "$(date_stringer ' '): starting $screen_name now..."
39 #hmmm: version check for if we're using old screen?  this -L change was a mistake though for the screen project owners on ubuntu.
40 local boguslog=$HOME/screen_junk_$(date_stringer).log
41 #maybe they unbroke it in 17.10?  yes, but it requires NO space now.  *&@#*&@#
42 #hmmm: bring back old version but check for ubuntu 17.04 vs 17.10 now.
43 #actually they made it a new parm.  arghhh!
44   screen -L $boguslog -S "$screen_name" -d -m nice -n $NICENESS_LEVEL mono "$app_name" 
45
46   echo "$(date_stringer ' '): $screen_name started."
47   # only sleep if we are not at the last process that gets started.
48   if [ "$app_name" != "OpenSim.exe" ]; then
49     sleep $SNOOZE_TIME
50   fi
51 }
52
53 # finds the opensim process specified or returns a blank string in the
54 # OS_PROC_ID variable.
55 export OS_PROC_ID=
56 function find_opensim_process()
57 {
58   OS_PROC_ID=
59   process_name="$1"; shift
60   if [ -z "$process_name" ]; then
61     return 1  # failure in call.
62   fi
63   OS_PROC_ID=$(ps wuax | grep "[0-9] mono $process_name" | grep -vi screen | sed -e "s/$USER  *\([0-9][0-9]*\).*/\1/" | head -n 1)
64 }
65
66 # takes a screen name for the detached screen session and a process name that
67 # we should be able to find running.  we make sure that both are shut down.
68 function close_application()
69 {
70   screen_name="$1"; shift
71   process_name="$1"; shift
72   echo "$(date_stringer ' '): stopping $screen_name now..."
73   screen -r -s "$screen_name" -X quit
74
75   # we don't want to shut any other servers down until this process is really gone.
76   find_opensim_process $process_name
77   if [ ! -z "$OS_PROC_ID" ]; then
78     echo "$(date_stringer ' '): waiting for $screen_name to really shut down..."
79     sleep $SNOOZE_TIME
80     # check again after the snooze.
81     find_opensim_process $process_name
82     while [ ! -z "$OS_PROC_ID" ]; do
83       find_opensim_process $process_name
84 #break out on timed basis.
85     done
86     echo "$(date_stringer ' '): $screen_name really is shut down now."
87
88 #do this as last ditch, above in timeout
89     find_opensim_process $process_name
90     if [ ! -z "$OS_PROC_ID" ]; then
91       echo "process for $screen_name still exists, killing $process_name (id $OS_PROC_ID) now."
92       kill -9 $OS_PROC_ID
93       sleep 2
94     fi
95
96   fi
97
98   echo "$(date_stringer ' '): $screen_name stopped."
99 }
100