Today a short post about running external program from Ruby. I'll start with giving you a nice link: 6 Ways to Run Shell Commands in Ruby. Today I'm going to concentrate on only one of the methods described there:
A small Ruby program I use when I access a PostgreSQL database on my local machine. What it does (in order):
- ensure PostgreSQL server is not running
- start the server
- start the pgAdmin
- wait for the pgAdmin to finish
- stop the server.
As you see, I use
One more thing I was trying to do is to redirect the Server console output to the program's own console. I succeeded with this, but for some reason I couldn't make the
Here's how I was redirecting output:
As I say, the redirection was working fine, but if there was no input from the server process and the pgAdmin finished at that time,
I tried to use several other variations with
One day I'll post about how to connect to the database from Ruby, too.
IO::popen.
A small Ruby program I use when I access a PostgreSQL database on my local machine. What it does (in order):
- ensure PostgreSQL server is not running
- start the server
- start the pgAdmin
- wait for the pgAdmin to finish
- stop the server.
POSTGRESQL_DIR="C:/Program Files/PostgreSQL/8.2"
SERVER_PATH="\"#{POSTGRESQL_DIR}/bin/pg_ctl.exe\""
DATA_DIR="\"#{POSTGRESQL_DIR}/data/\""
START_COMMAND="#{SERVER_PATH} start -D #{DATA_DIR}"
STOP_COMMAND="#{SERVER_PATH} stop -D #{DATA_DIR}"
ADMIN_PATH="\"#{POSTGRESQL_DIR}/bin/pgAdmin3.exe\""
Process.waitpid(IO::popen(STOP_COMMAND).pid)
puts "PostgreSQL Server stopped."
IO::popen(START_COMMAND)
puts "PostgreSQL Server started."
adm_pid=IO::popen(ADMIN_PATH).pid
puts "pgAdmin started."
puts "Waiting for pgAdmin to finish..."
Process.waitpid(adm_pid)
puts "pgAdmin closed."
Process.waitpid(IO::popen(STOP_COMMAND).pid)
puts "PostgreSQL Server stopped."
IO::popento spawn a process, and also I get the process'
pid
to wait for it to finish using Process.waidpid(pid).
One more thing I was trying to do is to redirect the Server console output to the program's own console. I succeeded with this, but for some reason I couldn't make the
Process::pidwork when I was redirecting the output. Anybody knows why?
Here's how I was redirecting output:
Thread::new(IO::popen(START_COMMAND))\
{ |srv|
until srv.eof?
print srv.readpartial(1024)
end
}
Process::pidwas still waiting (it interrupted when there came some input from the server console, though).
I tried to use several other variations with
sysread
, readpartial
and select
, but none was better, some even worse than this one. Thanks for any suggestions.One day I'll post about how to connect to the database from Ruby, too.
No comments:
Post a Comment