Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. 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 16
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 37
def active?
  @shell.process_controller.active_job?(self)
end
            
each(rs = nil) click to toggle source
 
               # File shell/system-command.rb, line 136
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 62
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 41
def input=(inp)
  super
  if active?
    start_export
  end
end
            
kill(sig) click to toggle source
 
               # File shell/system-command.rb, line 77
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 148
def notify(*opts, &block)
  @shell.notify(*opts) do |mes|
    yield mes if iterator?

    mes.gsub!("%id", "#{@command}:##{@pid}")
    mes.gsub!("%name", "#{@command}")
    mes.gsub!("%pid", "#{@pid}")
    mes
  end
end
            
start() click to toggle source
 
               # File shell/system-command.rb, line 48
def start
  notify([@command, *@opts].join(" "))

  @pid, @pipe_in, @pipe_out = @shell.process_controller.sfork(self) {
    Dir.chdir @shell.pwd
    $0 = @command
    exec(@command, *@opts)
  }
  if @input
    start_export
  end
  start_import
end
            
start_export() click to toggle source
 
               # File shell/system-command.rb, line 109
def start_export
  notify "job(%id) start exp-pipe.", @shell.debug?
  _eop = true
  Thread.start{
    begin
      @input.each do |l|
        ProcessController::block_output_synchronize do
          @pipe_out.print l
        end
      end
      _eop = false
    rescue Errno::EPIPE, Errno::EIO
      _eop = false
    ensure
      if !ProcessController::USING_AT_EXIT_WHEN_PROCESS_EXIT and _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.")
        redo
      end
      notify "job(%id) close exp-pipe.", @shell.debug?
      @pipe_out.close
    end
  }
end
            
start_import() click to toggle source
 
               # File shell/system-command.rb, line 83
def start_import
  notify "Job(%id) start imp-pipe.", @shell.debug?
  rs = @shell.record_separator unless rs
  _eop = true
  Thread.start {
    begin
      while l = @pipe_in.gets
        @input_queue.push l
      end
      _eop = false
    rescue Errno::EPIPE
      _eop = false
    ensure
      if !ProcessController::USING_AT_EXIT_WHEN_PROCESS_EXIT and _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.")
        redo
      end
      notify "job(%id}) close imp-pipe.", @shell.debug?
      @input_queue.push :EOF
      @pipe_in.close
    end
  }
end
            
super_each(rs = nil) click to toggle source
Alias for: each
terminate() click to toggle source
 
               # File shell/system-command.rb, line 66
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 33
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.