Init Script
From OpenSimulator
(Difference between revisions)
(New page: The following is an init script that I wrote for starting, stopping, and monitoring OpenSim on Linux systems. It makes an assumption that the opensim working instance is in OpenSimPath (s...) |
Revision as of 09:46, 25 January 2009
The following is an init script that I wrote for starting, stopping, and monitoring OpenSim on Linux systems. It makes an assumption that the opensim working instance is in OpenSimPath (seen in the script). It also makes some other assumptions on environment, including that you are running mysql, so while it may not be suitable for all environments, it has been very useful for the environments that I run.
#!/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