I'm trying to fork a sub-process, wait for it to finish, if it doesn't finish within a certain amount of time, kill it.
This is what I have so far:
servers.each do |server|
pid = fork do
puts "Forking #{server}."
output = "doing stuff here"
puts output
end
Process.wait
puts "#{server} child exited, pid = #{pid}"
end
Somewhere after/around Process.wait, I would like some sort of utility to wait 20 seconds, and if the process is still out there, I'd like to kill it and mark output as "ERROR."
I'm new to fork/exec. My code actually forking works, but I just don't know how to approach the waiting / killing aspect of it.
Use the Timeout
module: (code from http://www.whatastruggle.com/timeout-a-subprocess-in-ruby)
require 'timeout'
servers.each do |server|
pid = fork do
puts "Forking #{server}."
output = "doing stuff here"
puts output
end
begin
Timeout.timeout(20) do
Process.wait
end
rescue Timeout::Error
Process.kill 9, pid
# collect status so it doesn't stick around as zombie process
Process.wait pid
end
puts "#{server} child exited, pid = #{pid}"
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With