|
|
(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>
| + | |