Executing program from ruby

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?

···

--
Marcin Raczkowski
---
Friends teach what you should know
Enemies Teach what you have to know

popen and its derivatives?

  robert

···

On 19.04.2007 15:21, Marcin Raczkowski wrote:

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?

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

···

On Apr 19, 2007, at 8:21 AM, Marcin Raczkowski wrote:

any expirience with open4? help? pointers?

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:open4-0.9.3 > pwd
   /home/ahoward/eg/ruby/open4/open4-0.9.3

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

   harp:open4-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 :wink: can you give and example of
exactly what you're trying to do?

regards.

-a

···

On Thu, 19 Apr 2007, Marcin Raczkowski wrote:
--
be kind whenever possible... it is always possible.
- the dalai lama

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

···

On Thursday 19 April 2007 13:34, James Edward Gray II wrote:

On Apr 19, 2007, at 8:21 AM, Marcin Raczkowski wrote:
> 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

--
Marcin Raczkowski
---
Friends teach what you should know
Enemies Teach what you have to know

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 :confused: took me 2h to figure that out.

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

···

On Thursday 19 April 2007 15:04, ara.t.howard@noaa.gov wrote:

On Thu, 19 Apr 2007, Marcin Raczkowski wrote:
> 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:open4-0.9.3 > pwd
   /home/ahoward/eg/ruby/open4/open4-0.9.3

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

   harp:open4-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 :wink: can you give and example of
exactly what you're trying to do?

regards.

-a

--
Marcin Raczkowski
---
Friends teach what you should know
Enemies Teach what you have to know