Hello
I’m a bit new to Ruby, and I’m trying to set up a tomcat control script.
The main loop of the control script will allow the user to start, stop,
and configure various instances of Tomcat.
In this scenario, if a user wishes to start a tomcat instance, he/she
will type:
% start 8080
The script then will execute:
command = “8080/bin/catalina.sh start”
system command
And then the catalina.sh script will then execute some java [options…]
& in the background.
The control is then returned to the main program loop. This works well.
However, any CTRL-C that the main Ruby control loop receives is always
propagated to the java process that is in the background, shutting down
all of the servers that I have started using this script. I can’t seem
to control this propagation. I’ve added:
trap(“INT”) {
puts “Interrupt caught…”
}
Which works, but the interrupt still makes its way out to my child
processes. Is there any way that I can have these programs continue to
execute in the background?
Thanks for any help.
I created a small code example that reproduces this:
#!/usr/bin/env ruby
def start(server)
return if not server
pwd = Dir.pwd
command = "/usr/bin/java "
command+=
"-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager "
command+=
"-Djava.util.logging.config.file=#{pwd}/#{server}/conf/logging.properties
"
command+= "-Djava.endorsed.dirs=#{pwd}/#{server}/common/endorsed "
command+= "-Dcatalina.base=#{pwd}/#{server} "
command+= "-Dcatalina.home=#{pwd}/#{server} "
command+= "-Djava.io.tmpdir=#{pwd}/#{server}/temp "
command+= "-classpath
:#{pwd}/#{server}/bin/bootstrap.jar:#{pwd}/#{server}/bin/commons-logging-api.jar
"
command+= "-Xmx300m "
command+= "org.apache.catalina.startup.Bootstrap "
command+= "start "
command+= ">> #{pwd}/#{server}/logs/catalina.out 2>&1 & "
puts command
pid = fork do
Signal.trap(‘HUP’, ‘IGNORE’)
Signal.trap(‘INT’, ‘IGNORE’)
exec command
end
Process.detach(pid)
end
start 8080
loop do
puts “hi”
sleep 1
end
After Tomcat is started, the console starts outputting “hi” every
second. A CTRL-C will kill the loop and the tomcat process. Is it
possible that the Tomcat process is also reading from STDIN? I have
also tried trapping the INT signal on the parent process with no luck
(the Tomcat process quits, but the main process does not)