Class: Shell::SystemCommand
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Class Chain: 
          self,
           Filter | |
| Instance Chain: 
          self,
           Filter,
          Enumerable | |
| Inherits: | Shell::Filter 
 | 
| Defined in: | lib/shell/system-command.rb | 
Class Method Summary
Instance Attribute Summary
- #active? ⇒ Boolean readonly
- #command (also: #name) readonly
- #input=(inp) writeonly
- 
    
      #name  
    
    readonly
    Alias for #command. 
- #wait? ⇒ Boolean readonly
Filter - Inherited
Instance Method Summary
- #each(rs = nil)
- #flush
- #kill(sig)
- 
    
      #notify(*opts)  
    
    ex). 
- #start
- #start_export
- #start_import
- 
    
      #super_each(rs = nil)  
    
    Alias for Filter#each. 
- #terminate
Filter - Inherited
| #+ | Outputs  | 
| #< | Inputs from  | 
| #> | Outputs from  | 
| #>> | Appends the output to  | 
| #each | Iterates a block for each line. | 
| #inspect, #to_a, #to_s, | |
| #| | Processes a pipeline. | 
Constructor Details
    .new(sh, command, *opts)  ⇒ SystemCommand 
  
# File 'lib/shell/system-command.rb', line 17
def initialize(sh, command, *opts) if t = opts.find{|opt| !opt.kind_of?(String) && opt.class} Shell.Fail TypeError, t.class, "String" end super(sh) @command = command @opts = opts @input_queue = Thread::Queue.new @pid = nil sh.process_controller.add_schedule(self) end
Instance Attribute Details
    #active?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'lib/shell/system-command.rb', line 38
def active? @shell.process_controller.active_job?(self) end
#command (readonly) Also known as: #name
[ GitHub ]# File 'lib/shell/system-command.rb', line 31
attr_reader :command
#input=(inp) (writeonly)
[ GitHub ]# File 'lib/shell/system-command.rb', line 42
def input=(inp) super if active? start_export end end
#name (readonly)
Alias for #command.
# File 'lib/shell/system-command.rb', line 32
alias name command
    #wait?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'lib/shell/system-command.rb', line 34
def wait? @shell.process_controller.waiting_job?(self) end
Instance Method Details
#each(rs = nil)
[ GitHub ]# File 'lib/shell/system-command.rb', line 136
def each(rs = nil) while (l = @input_queue.pop) != :EOF yield l end end
#flush
[ GitHub ]# File 'lib/shell/system-command.rb', line 63
def flush @pipe_out.flush if @pipe_out and !@pipe_out.closed? end
#kill(sig)
[ GitHub ]# File 'lib/shell/system-command.rb', line 78
def kill(sig) if @pid Process.kill(sig, @pid) end end
#notify(*opts)
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 'lib/shell/system-command.rb', line 148
def notify(*opts) @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
[ GitHub ]# File 'lib/shell/system-command.rb', line 49
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
[ GitHub ]# File 'lib/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
[ GitHub ]# File 'lib/shell/system-command.rb', line 84
def start_import notify "Job(%id) start imp-pipe.", @shell.debug? _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)
Alias for Filter#each.
# File 'lib/shell/system-command.rb', line 135
alias super_each each
#terminate
[ GitHub ]# File 'lib/shell/system-command.rb', line 67
def terminate begin @pipe_in.close rescue IOError end begin @pipe_out.close rescue IOError end end