Extended maintenance of Ruby versions 1.8.7 and 1.9.2 ended on July 31, 2014. Read more

In Files

  • shell/system-command.rb

Shell::SystemCommand

Attributes

command[R]
name[R]

Public Class Methods

new(sh, command, *opts) click to toggle source
 
               # File shell/system-command.rb, line 17
def initialize(sh, command, *opts)
  if t = opts.find{|opt| !opt.kind_of?(String) && opt.class}
    Shell.Fail Error::TypeError, t.class, "String"
  end
  super(sh)
  @command = command
  @opts = opts
  
  @input_queue = Queue.new
  @pid = nil

  sh.process_controller.add_schedule(self)
end
            

Public Instance Methods

active?() click to toggle source
 
               # File shell/system-command.rb, line 38
def active?
  @shell.process_controller.active_job?(self)
end
            
each(rs = nil) click to toggle source
 
               # File shell/system-command.rb, line 144
def each(rs = nil)
  while (l = @input_queue.pop) != :EOF
    yield l
  end
end
            
Also aliased as: super_each
flush() click to toggle source
 
               # File shell/system-command.rb, line 60
def flush
  @pipe_out.flush if @pipe_out and !@pipe_out.closed?
end
            
input=(inp) click to toggle source
 
               # File shell/system-command.rb, line 42
def input=(inp)
  super
  if active?
    start_export
  end
end
            
kill(sig) click to toggle source
 
               # File shell/system-command.rb, line 75
def kill(sig)
  if @pid
    Process.kill(sig, @pid)
  end
end
            
notify(*opts, &block) click to toggle source

ex)

if you wish to output: 
   "shell: job(#{@command}:#{@pid}) close pipe-out."
then 
   mes: "job(%id) close pipe-out."
yorn: Boolean(@shell.debug? or @shell.verbose?)
 
               # File shell/system-command.rb, line 156
def notify(*opts, &block)
  Thread.exclusive do
    @shell.notify(*opts) {|mes|
      yield mes if iterator?

      mes.gsub!("%id", "#{@command}:##{@pid}")
      mes.gsub!("%name", "#{@command}")
      mes.gsub!("%pid", "#{@pid}")
    }
  end
end
            
start() click to toggle source
 
               # File shell/system-command.rb, line 49
def start
  @pid, @pipe_in, @pipe_out = @shell.process_controller.sfork(self) {
    Dir.chdir @shell.pwd
    exec(@command, *@opts)
  }
  if @input
    start_export
  end
  start_import
end
            
start_export() click to toggle source
 
               # File shell/system-command.rb, line 116
    def start_export
      notify "job(%id) start exp-pipe.", @shell.debug?
      _eop = true
      th = Thread.start{
        Thread.critical = true
        begin
          Thread.critical = false
          @input.each{|l| @pipe_out.print l}
          _eop = false
        rescue Errno::EPIPE
          _eop = false
        ensure
          if _eop
            notify("shell: warn: Process finishing...",
                   "wait for Job(%id) to finish pipe exporting.",
                   "You can use Shell#transact or Shell#check_point for more safe execution.")
#           Tracer.on
            redo
          end
          Thread.exclusive do
            notify "job(%id) close exp-pipe.", @shell.debug?
            @pipe_out.close
          end
        end
      }
    end
            
start_import() click to toggle source
 
               # File shell/system-command.rb, line 82
    def start_import
#      Thread.critical = true
      notify "Job(%id) start imp-pipe.", @shell.debug?
      rs = @shell.record_separator unless rs
      _eop = true
#      Thread.critical = false
      th = Thread.start {
        Thread.critical = true
        begin
          Thread.critical = false
          while l = @pipe_in.gets
            @input_queue.push l
          end
          _eop = false
        rescue Errno::EPIPE
          _eop = false
        ensure
          if _eop
            notify("warn: Process finishing...",
                   "wait for Job[%id] to finish pipe importing.",
                   "You can use Shell#transact or Shell#check_point for more safe execution.")
#           Tracer.on
            Thread.current.run
            redo
          end
          Thread.exclusive do
            notify "job(%id}) close imp-pipe.", @shell.debug?
            @input_queue.push :EOF
            @pipe_in.close
          end
        end
      }
    end
            
super_each(rs = nil) click to toggle source
Alias for: each
terminate() click to toggle source
 
               # File shell/system-command.rb, line 64
def terminate
  begin
    @pipe_in.close
  rescue IOError
  end
  begin
    @pipe_out.close
  rescue IOError
  end
end
            
wait?() click to toggle source
 
               # File shell/system-command.rb, line 34
def wait?
  @shell.process_controller.waiting_job?(self)
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus