URLS: |
http://raa.ruby-lang.org/project/session/
http://www.codeforpeople.com/lib/ruby/session/
NAME: |
Session
::Sh
::Bash
::Shell
::IDL
SYNOPSIS: |
Session::* offers a set of class for driving external progams via pipes. It
offers a significant abstraction over Open3::popen since stdout/stderr can
be processed individually for each command. Additionally the exit_status of
each command is made available. eg.
bash = Session::Bash.new
stdout, stderr = bash.execute 'ls'
or
bash = Session::Bash.new
stdout, stderr = StringIO.new, StringIO.new
bash.execute 'ls', :stdout => stdout, :stderr => stderr
exit_status = bash.exit_status
or
bash = Session::Bash.new
···
#
# output is passed to the block as it is produced
#
bash.execute( 'long_running_command.exe' ) do |out, err|
logger << out if out
elogger << err if err
end
Sessions are Thread safe (in the sense that they do not block on io
operations) allowing command spawn from guis to update widgets with output
while running in the background.
button.configure 'action' => lambda do
sh = Session::new
sh.execute(cmd) do |o,e|
out_widget.update o if o
err_widget.update e if e
end
end
SAMPLES: |
see samples/*
AUTHOR: |
ara.t.howard@noaa.gov
HISTORY: |
2.1.8:
- greatly simplified read loop using two reader threads, one for stderr and
one for stdout alongside a mutex to protect data. this streamlined the code
alot vs. the old select method including allowing removal of the linbuffer
class. the interface remains exactly as before however.
2.1.7:
- improved thread safe non-blocking read method
- gemspec
2.1.6:
- wrapped send_command in a Thread (send async) so output processing can
commend immeadiately. this was o.k. before, but had strange behaviour when
using popen3 from threads. thanks to tanaka akira for this suggestion.
- iff ENV['SESSION_USE_SPAWN'] is set Session uses Spawn::spawn instead of
Open3::popen3. also noted that spawn seems to be a bit faster.
- added tests for threads.
- run 'sh SESSION_USE_SPAWN=1 ruby test/session.rb' to test using spawn
- added test for idl so it's test is not run if system doesn't have it, all
that should be required for 'ruby test/session.rb' is should be sh'
- removed sample/tcsh and note about Tcsh and Csh in README - stderr
redirection/separation is flaky in those shells
2.1.5:
- added Session.use_spawn=, AbstractSession.use_spawn=, and an :use_session=>
option to AbstractSession#initialize. if any of them are set the code uses
Spawn::spawn to create external processes instead of Open3::popen3.
Spawn::spawn uses named pipes (fifos) for IPC instead of forking and pipes.
the fork used in popen3 can cause strange behaviour with multi-threaded apps
(like a tk app). see source for details
2.1.4:
- added Thread.exclusive{} wrapper when io is read to works in multi
threaded apps
enjoy.
-a
--
EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen
===============================================================================