Ruby On Windows - Forking other processes
While moving our VM deployment site written in Sinatra to a Windows machine with the VMware PowerCLI toolkit installed the only snag was where we forked a process to do the preparation of the machines. Both Kernel.fork and Process.detach seemed to have issues.
Original MRI on Linux
def build
pid = fork { run_command }
Process.detach(pid)
end
def run_command
`sudo /opt/script/deployserver/setupnewserver.sh -p #{poolserver} -i #{ip} -s #{@size} -v #{@vlan} -a "#{@owner}" -n #{@name} -e "#{@email}"`
end
IronRuby
We tried IronRuby and the same bit of the script broke as on win32 MRI (though I was pleased and surprised that Sinatra worked)
def build
WindowsProcess.start "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"-PSConsoleFile \"C:\\Program Files (x86)\\VMware\\Infrastructure\\vSphere PowerCLI\\vim.psc1\" \"& C:\\script\\DataStoreUsage.ps1\""
end
Using the following DotNet code
class WindowsProcess
def self.start(file, arguments)
process = System::Diagnostics::Process.new
process.StartInfo.FileName = file
process.StartInfo.CreateNoWindow = true
process.StartInfo.Arguments = arguments
process.Start
end
end
Workaround using Windows “start” command
I had hoped the module at win32utils would let me just use the original script but fork did not work properly still.
ruby
def build
commandstr = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -PSConsoleFile \"C:\\Program Files (x86)\\VMware\\Infrastructure\\vSphere PowerCLI\\vim.psc1\" \"& C:\\Sites\\vmdeploy\\PrepNewMachine.ps1 -type #{@type} -machinename #{@name} -size #{@size} -vlan #{@vlan} -creator #{@owner} -creatoremail #{@email} -ipaddress #{ip}"
system ("start #{commandstr} > ./log/#{@name}.log 2>&1")
end
This uses the windows “start” command and works pretty well.