Init Script

From OpenSimulator

(Difference between revisions)
Jump to: navigation, search
m (redirecting an orphaned, obsolete init_script page to our current Linux startup scripts page)
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
The following is an init script that I wrote for starting, stopping, and monitoring OpenSim on Linux systems.  It makes some assumptions, and is only going to work (unmoddified) if you stay with those assumptions:
+
#REDIRECT [[Startup_script_linux]]
* Your opensim instance is in /opt/opensim/staging/bin (that's an easy change)
+
* You are only running 1 OpenSim.exe process per machine (that's '''not''' easy to change)
+
* You are using mysql (that's easy to change)
+
* Production mono is in /usr/local/bin (that's easy to change)
+
While it may not be suitable for all environments, it has been very useful for the environments that I run.
+
 
+
<source lang="ruby">
+
#!/usr/bin/ruby
+
 
+
# Start or stop OpenSim
+
#
+
# Sean Dague <sdague@gmail.com>
+
 
+
### BEGIN INIT INFO
+
# Provides:          opensim
+
# Required-Start:    $local_fs $remote_fs $syslog $named $network $time $mysql
+
# Required-Stop:    $local_fs $remote_fs $syslog $named $network
+
# Default-Start:    2 3 4 5
+
# Default-Stop:      0 1 6
+
# Short-Description: start and stop opensim
+
# Description:      opensim init script
+
### END INIT INFO
+
 
+
require "rexml/document"
+
require "open-uri"
+
include REXML
+
 
+
OpenSimPath = "/opt/opensim/staging/bin"
+
Dir.chdir(OpenSimPath)
+
 
+
@host = "localhost"
+
@port = 9000
+
@uuid = "0"
+
 
+
def parse_config
+
    # first we figure out the external hostname of a region on the box
+
    Dir.new("#{OpenSimPath}/Regions").find do |f|
+
        if f =~ /\.xml$/
+
            doc = Document.new(File.new("#{OpenSimPath}/Regions/#{f}"))
+
           
+
            if doc.root.elements['Config'].attributes['external_host_name']
+
                @host = doc.root.elements['Config'].attributes['external_host_name']
+
            else
+
                @host = doc.root.elements['Config'].elements['external_host_name'].text
+
            end
+
     
+
            if doc.root.elements['Config'].attributes['sim_UUID']
+
                @uuid = doc.root.elements['Config'].attributes['sim_UUID'].gsub(/-/,'')
+
            else
+
                @uuid = doc.root.elements['Config'].elements['sim_UUID'].text.gsub(/-/,'')
+
            end
+
           
+
            break
+
        end
+
    end
+
    # then we figure out the external port from opensim.ini
+
    open("#{OpenSimPath}/OpenSim.ini") do |f|
+
        f.each do |line|
+
            if line =~ /^\s*http_listener_port/
+
                (key, equal, port) = line.split
+
                if port
+
                    @port = port
+
                end
+
            end
+
        end
+
    end
+
end
+
 
+
def alive?
+
    begin
+
        open("http://#{@host}:#{@port}/index.php?method=regionImage#{@uuid}") do |f|
+
            resp = f.read
+
            return true
+
        end
+
    rescue => e
+
    end
+
    return false
+
end
+
 
+
def pidof(item)
+
    IO.popen("ps auxw | grep #{item} | grep -v grep") do |line|
+
        line.each do |l|
+
            return l.split[1].to_i
+
        end
+
    end
+
    return nil
+
end
+
 
+
def opensim_pid
+
    return pidof("OpenSim.exe")
+
end
+
 
+
def status
+
    if alive?
+
        puts "OK"
+
        exit 0
+
    else
+
        puts "FAILED"
+
        exit 1
+
    end
+
end
+
 
+
def start
+
    if alive?
+
        puts "OpenSim already running"
+
        exit 0
+
    end
+
    if opensim_pid != nil
+
        # opensim process is running, but not responding, we're hung
+
        stop
+
        # this really is needed otherwise you get a wedge
+
        system("/etc/init.d/mysql restart")
+
        sleep 10
+
        # purge the addin cache, this may have been the reason for the hang
+
        system("rm -rf addin-db-*")
+
    end
+
    system("screen -wipe")
+
    system("screen -d -S opensim -m /usr/local/bin/mono --debug OpenSim.exe")
+
   
+
    20.times do |t|
+
        if alive?
+
            return
+
        end
+
        sleep 5
+
    end
+
   
+
    puts "FAILED to start region"
+
    exit 1
+
end
+
 
+
def stop
+
    if opensim_pid == nil
+
        puts "OpenSim not running"
+
        exit 0
+
    end
+
    system("screen -wipe")
+
    system("screen -S opensim -X eval 'stuff \"shutdown\015\"'")
+
    puts "Shutting down... waiting 30 seconds"
+
    30.times do |i|
+
        if opensim_pid == nil
+
            return
+
        end
+
        $stderr.write "."
+
        sleep 1
+
    end
+
   
+
    pid = opensim_pid
+
    if pid
+
        puts "Process not responding, forcing shutdown"
+
        Process.kill(9, pid)
+
    end
+
   
+
end
+
 
+
def main
+
    parse_config
+
   
+
    mode = ARGV[0]
+
   
+
    if mode == "start"
+
        start
+
    elsif mode == "stop"
+
        stop
+
    elsif mode == "status"
+
        status
+
    elsif mode == "process"
+
        puts opensim_pid
+
    elsif mode == "restart"
+
        puts "called restart"
+
    else
+
        puts "unknown"
+
    end
+
end
+
 
+
main
+
</source>
+

Latest revision as of 08:08, 21 September 2020

  1. REDIRECT Startup_script_linux
Personal tools
General
About This Wiki