Class: ChildProcess::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/childprocess/server.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeServer

Returns a new instance of Server.



28
29
30
31
# File 'lib/childprocess/server.rb', line 28

def initialize
  @processes = {}
  @mutex = Mutex.new
end

Class Method Details

.connect(uri) ⇒ DrbObject<Server>

Connect to existing DRb service.

Parameters:

  • uri (String)

    drb path

Returns:

  • (DrbObject<Server>)

    remote server



12
13
14
15
# File 'lib/childprocess/server.rb', line 12

def self.connect(uri)
  DRb.start_service
  DRbObject.new_with_uri(uri)
end

Instance Method Details

#alive?(pid) ⇒ Bool

Check whether a process managed by this server is alive.

Parameters:

  • pid (Integer)

    process id

Returns:

  • (Bool)

    whether that process is alive, nil if that process is not managed by this server



86
87
88
89
90
# File 'lib/childprocess/server.rb', line 86

def alive?(pid)
  access_processes do |processes|
    processes[pid] && processes[pid].alive?
  end
end

#clean_upObject

Clean up exited processes.



102
103
104
105
106
107
108
109
110
111
112
# File 'lib/childprocess/server.rb', line 102

def clean_up
  access_processes do |processes|
    processes.values.select(&:exited?).each do |process|
      process.io.stdout.path.unlink rescue nil
    end
    processes.delete_if { |_, process| process.exited? }
    # Do not leak @processes outside
    # We are using dRuby, keep input/output objects simple
    nil
  end
end

#launch(*commands) ⇒ Integer

Launch a process in background.

Parameters:

  • commands (Array<String>)

    commands

Returns:

  • (Integer)

    pid



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/childprocess/server.rb', line 37

def launch(*commands)
  output = Tempfile.new('cps-out')
  output.sync = true

  process = ChildProcess.build(*commands)
  process.io.stdout = process.io.stderr = output
  process.duplex = true
  process.start

  pid = process.pid
  access_processes do |processes|
    processes[pid] = process
  end
  pid
end

#list_pidsArray<Integer>

List process ids managed by this server.

Returns:

  • (Array<Integer>)

    process ids



75
76
77
78
79
# File 'lib/childprocess/server.rb', line 75

def list_pids
  access_processes do |processes|
    processes.keys
  end
end

#read_output(pid) ⇒ String

Read output, will not block.

Parameters:

  • pid (Integer)

    process id

Returns:

  • (String)

    output so far, nil on error



57
58
59
60
61
# File 'lib/childprocess/server.rb', line 57

def read_output(pid)
  access_processes do |processes|
    File.read(processes[pid].io.stdout.path) rescue nil 
  end
end

#start_service(uri, wait = true) ⇒ DRb::DRbServer

Start DRb service.

Parameters:

  • wait (Bool) (defaults to: true)

    whether to block and wait for drb service to end

  • uri (String)

    drb path

Returns:

  • (DRb::DRbServer)


22
23
24
25
26
# File 'lib/childprocess/server.rb', line 22

def start_service(uri, wait = true)
  server = DRb.start_service(uri, self)
  DRb.thread.join if wait
  server
end

#stop(pid) ⇒ Object

Stop a process managed by this server.

Parameters:

  • pid (Integer)

    process id



95
96
97
98
99
# File 'lib/childprocess/server.rb', line 95

def stop(pid)
  access_processes do |processes|
    processes[pid] && processes[pid].stop
  end
end

#write_input(pid, content) ⇒ Object

Write to input.

Parameters:

  • pid (Integer)

    process id



66
67
68
69
70
# File 'lib/childprocess/server.rb', line 66

def write_input(pid, content)
  access_processes do |processes|
    processes[pid] && processes[pid].io.stdin.write(content) rescue nil
  end
end