Executing program from ruby

M

Marcin Raczkowski

Hello i know there are several ways to execute from within ruby
but each one have their own problems:

`` doesn't check if command /programm runs at all!, also it blocks untill
command returns, no bi-directional comunication
popen2,3,4 doesn't check if command exists at all ... it's not rising any
errors ... and happilly continues to run untill you try to write something to
pipe that leads to program that never even started

only system() checks if command runs but it also returns false when programs
starts but returns anything other then 0

does anyone know good way to check if command exists then run it, return pid
for monitoring purposes and allow bidirectional comunication, then check exit
status ?

open4 comes close to fulfilling all that but it doesn't rise (sample program
that tells you it'll doesn't eaither), not to mention compleate lack of
documentation.

any expirience with open4? help? pointers?
mayby i'm simply missing some obvious way?
 
R

Robert Klemme

Hello i know there are several ways to execute from within ruby
but each one have their own problems:

`` doesn't check if command /programm runs at all!, also it blocks untill
command returns, no bi-directional comunication
popen2,3,4 doesn't check if command exists at all ... it's not rising any
errors ... and happilly continues to run untill you try to write something to
pipe that leads to program that never even started

only system() checks if command runs but it also returns false when programs
starts but returns anything other then 0

does anyone know good way to check if command exists then run it, return pid
for monitoring purposes and allow bidirectional comunication, then check exit
status ?

open4 comes close to fulfilling all that but it doesn't rise (sample program
that tells you it'll doesn't eaither), not to mention compleate lack of
documentation.

any expirience with open4? help? pointers?
mayby i'm simply missing some obvious way?

popen and its derivatives?

robert
 
J

James Edward Gray II

any expirience with open4? help? pointers?

TextMate uses a hand-rolled popen3(), which is really just an open4()
clone. Allan Odgaard, the creator of TextMate, wrote the code, but
it's straightforward enough that I thought it might help you to see it:

def my_popen3(*cmd) # returns [stdin, stdout, strerr, pid]
pw = IO::pipe # pipe[0] for read, pipe[1] for write
pr = IO::pipe
pe = IO::pipe

pid = fork{
pw[1].close
STDIN.reopen(pw[0])
pw[0].close

pr[0].close
STDOUT.reopen(pr[1])
pr[1].close

pe[0].close
STDERR.reopen(pe[1])
pe[1].close

exec(*cmd)
}

pw[0].close
pr[1].close
pe[1].close

pw[1].sync = true

[pw[1], pr[0], pe[0], pid]
end

Hope that helps.

James Edward Gray II
 
M

Marcin Raczkowski

any expirience with open4? help? pointers?

TextMate uses a hand-rolled popen3(), which is really just an open4()
clone. Allan Odgaard, the creator of TextMate, wrote the code, but
it's straightforward enough that I thought it might help you to see it:

def my_popen3(*cmd) # returns [stdin, stdout, strerr, pid]
pw = IO::pipe # pipe[0] for read, pipe[1] for write
pr = IO::pipe
pe = IO::pipe

pid = fork{
pw[1].close
STDIN.reopen(pw[0])
pw[0].close

pr[0].close
STDOUT.reopen(pr[1])
pr[1].close

pe[0].close
STDERR.reopen(pe[1])
pe[1].close

exec(*cmd)
}

pw[0].close
pr[1].close
pe[1].close

pw[1].sync = true

[pw[1], pr[0], pe[0], pid]
end

Hope that helps.

James Edward Gray II

code is really simmilar to opn4 i understand how it works (i follow "don't use
wizard/library you don't understand " rule) ... and to be honest i can write
it myself, but i thought there's solution for problem already :]

well popen 3/4 is almost good enought .. but if you use it with block it
doesn't check if command was executed at all!!!

i need to do something like this:

check if command exists...
try to run it...
if there's problem (no privilages etc.) do some work about that , notify user
etc.
if program started write to it's stdin and get answer.

popen4 should do exactly that .. but sample that should rise error doesn't do
that, not to mention there's no documentation except changelog and few
samples.

thnx for reply tho
 
A

ara.t.howard

Hello i know there are several ways to execute from within ruby
but each one have their own problems:

`` doesn't check if command /programm runs at all!, also it blocks untill
command returns, no bi-directional comunication
popen2,3,4 doesn't check if command exists at all ... it's not rising any
errors ... and happilly continues to run untill you try to write something to
pipe that leads to program that never even started

only system() checks if command runs but it also returns false when programs
starts but returns anything other then 0

does anyone know good way to check if command exists then run it, return pid
for monitoring purposes and allow bidirectional comunication, then check exit
status ?

open4 comes close to fulfilling all that but it doesn't rise (sample program
that tells you it'll doesn't eaither),

??


harp:~ > ruby -r open4 -e' Open4.popen4 "no-exist" '
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:37:in `exec': No such file or directory - no-exist (Errno::ENOENT)
from /home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:37:in `popen4'
from /home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:21:in `popen4'
from -e:1


harp:~ > ruby -r open4 -e' Open4.spawn "no-exist" '
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:37:in `exec': No such file or directory - no-exist (Errno::ENOENT)
from /home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:37:in `popen4'
from /home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:21:in `popen4'
from /home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:273:in `spawn'
from /home/ahoward//lib/ruby/1.8/timeout.rb:38:in `timeout'
from /home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:272:in `spawn'
from -e:1

from the dist


harp:eek:pen4-0.9.3 > pwd
/home/ahoward/eg/ruby/open4/open4-0.9.3


harp:eek:pen4-0.9.3 > cat sample/exception.rb
require "open4"
Open4::popen4 "noexist"


harp:eek:pen4-0.9.3 > ruby sample/exception.rb
/home/ahoward/nfs//lib/ruby/site_ruby/1.8/open4.rb:37:in `exec': No such file or directory - noexist (Errno::ENOENT)
from /home/ahoward/nfs//lib/ruby/site_ruby/1.8/open4.rb:37:in `popen4'
from /home/ahoward/nfs//lib/ruby/site_ruby/1.8/open4.rb:21:in `fork'
from /home/ahoward/nfs//lib/ruby/site_ruby/1.8/open4.rb:21:in `popen4'
from sample/exception.rb:3



can you show an exampe which does not work?

not to mention compleate lack of > documentation.

??

http://codeforpeople.com/lib/ruby/open4/open4-0.9.3/README

this covers nearly every part of open4. if you need more, there is

http://codeforpeople.com/lib/ruby/open4/open4-0.9.3/lib/open4.rb

it is an extremely small library
any expirience with open4? help? pointers?
mayby i'm simply missing some obvious way?

i wrote open4 - so i'm expirienced with it ;-) can you give and example of
exactly what you're trying to do?

regards.

-a
 
M

Marcin Raczkowski

??


harp:~ > ruby -r open4 -e' Open4.popen4 "no-exist" '
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:37:in `exec': No such
file or directory - no-exist (Errno::ENOENT) from
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:37:in `popen4' from
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:21:in `popen4' from -e:1


harp:~ > ruby -r open4 -e' Open4.spawn "no-exist" '
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:37:in `exec': No such
file or directory - no-exist (Errno::ENOENT) from
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:37:in `popen4' from
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:21:in `popen4' from
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:273:in `spawn' from
/home/ahoward//lib/ruby/1.8/timeout.rb:38:in `timeout' from
/home/ahoward//lib/ruby/site_ruby/1.8/open4.rb:272:in `spawn' from -e:1

from the dist


harp:eek:pen4-0.9.3 > pwd
/home/ahoward/eg/ruby/open4/open4-0.9.3


harp:eek:pen4-0.9.3 > cat sample/exception.rb
require "open4"
Open4::popen4 "noexist"


harp:eek:pen4-0.9.3 > ruby sample/exception.rb
/home/ahoward/nfs//lib/ruby/site_ruby/1.8/open4.rb:37:in `exec': No such
file or directory - noexist (Errno::ENOENT) from
/home/ahoward/nfs//lib/ruby/site_ruby/1.8/open4.rb:37:in `popen4' from
/home/ahoward/nfs//lib/ruby/site_ruby/1.8/open4.rb:21:in `fork' from
/home/ahoward/nfs//lib/ruby/site_ruby/1.8/open4.rb:21:in `popen4' from
sample/exception.rb:3



can you show an exampe which does not work?


??

http://codeforpeople.com/lib/ruby/open4/open4-0.9.3/README

this covers nearly every part of open4. if you need more, there is

http://codeforpeople.com/lib/ruby/open4/open4-0.9.3/lib/open4.rb

it is an extremely small library


i wrote open4 - so i'm expirienced with it ;-) can you give and example of
exactly what you're trying to do?

regards.

-a

i sent you example on e-mail, but it was my fault... in you examples there's
no require 'rubygems', and it's required to work, if not it loads standard
open4 library :/ took me 2h to figure that out.

preaty good library tho (at least when i got it to work)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,177
Latest member
OrderGlucea
Top