Class: Aruba::Processes::SpawnProcess
- Inherits:
-
BasicProcess
- Object
- BasicProcess
- Aruba::Processes::SpawnProcess
- Defined in:
- lib/aruba/processes/spawn_process.rb
Overview
Spawn a process for command
‘SpawnProcess` is not meant for direct use - `SpawnProcess.new` - by users. Only it’s public methods are part of the public API of aruba, e.g. ‘#stdin`, `#stdout`.
Instance Attribute Summary
Attributes inherited from BasicProcess
#environment, #exit_status, #exit_timeout, #io_wait_timeout, #main_class, #startup_wait_time, #stop_signal, #working_directory
Class Method Summary collapse
-
.match?(_mode) ⇒ Boolean
Use as default launcher.
Instance Method Summary collapse
-
#close_io(name) ⇒ Object
Close io.
-
#content ⇒ String
Content of command.
-
#filesystem_status ⇒ Aruba::Platforms::FilesystemStatus
Return file system stats for the given command.
-
#initialize(cmd, exit_timeout, io_wait_timeout, working_directory, environment = Aruba.platform.environment_variables.hash_from_env, main_class = nil, stop_signal = nil, startup_wait_time = 0) ⇒ SpawnProcess
constructor
Create process.
- #interactive? ⇒ Boolean
-
#pid ⇒ Object
Output pid of process.
-
#send_signal(signal) ⇒ Object
Send command a signal.
-
#start {|SpawnProcess| ... } ⇒ Object
Run the command.
-
#stderr(opts = {}) ⇒ String
Access to stderr of process.
-
#stdin ⇒ Object
Access to stdin of process.
-
#stdout(opts = {}) ⇒ String
Access to stdout of process.
-
#stop ⇒ Object
Stop command.
-
#terminate ⇒ Object
Terminate command.
-
#wait ⇒ Object
Wait for command to finish.
- #write(input) ⇒ Object
Methods inherited from BasicProcess
#after_run, #arguments, #before_run, #command, #commandline, #empty?, #inspect, #output, #restart, #started?, #stopped?, #timed_out?
Constructor Details
#initialize(cmd, exit_timeout, io_wait_timeout, working_directory, environment = Aruba.platform.environment_variables.hash_from_env, main_class = nil, stop_signal = nil, startup_wait_time = 0) ⇒ SpawnProcess
Create process
131 132 133 134 135 136 137 138 139 |
# File 'lib/aruba/processes/spawn_process.rb', line 131 def initialize(cmd, exit_timeout, io_wait_timeout, working_directory, # rubocop:disable Metrics/ParameterLists environment = Aruba.platform.environment_variables.hash_from_env, main_class = nil, stop_signal = nil, startup_wait_time = 0) super @process = nil @stdout_cache = nil @stderr_cache = nil end |
Class Method Details
.match?(_mode) ⇒ Boolean
Use as default launcher
102 103 104 |
# File 'lib/aruba/processes/spawn_process.rb', line 102 def self.match?(_mode) true end |
Instance Method Details
#close_io(name) ⇒ Object
Close io
245 246 247 248 249 |
# File 'lib/aruba/processes/spawn_process.rb', line 245 def close_io(name) return if stopped? @process.public_send(name.to_sym).close end |
#content ⇒ String
Content of command
327 328 329 |
# File 'lib/aruba/processes/spawn_process.rb', line 327 def content File.read command_path end |
#filesystem_status ⇒ Aruba::Platforms::FilesystemStatus
Return file system stats for the given command
318 319 320 |
# File 'lib/aruba/processes/spawn_process.rb', line 318 def filesystem_status Aruba.platform.filesystem_status.new(command_path) end |
#interactive? ⇒ Boolean
331 332 333 |
# File 'lib/aruba/processes/spawn_process.rb', line 331 def interactive? true end |
#pid ⇒ Object
Output pid of process
This is the PID of the spawned process.
297 298 299 |
# File 'lib/aruba/processes/spawn_process.rb', line 297 def pid @process.pid end |
#send_signal(signal) ⇒ Object
Send command a signal
305 306 307 308 309 310 311 312 |
# File 'lib/aruba/processes/spawn_process.rb', line 305 def send_signal(signal) = %(Command "#{commandline}" with PID "#{pid}" has already stopped.) raise CommandAlreadyStoppedError, if @process.exited? Process.kill signal, pid rescue Errno::ESRCH raise CommandAlreadyStoppedError, end |
#start {|SpawnProcess| ... } ⇒ Object
Run the command
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/aruba/processes/spawn_process.rb', line 146 def start if started? = "Command \"#{commandline}\" has already been started. " \ 'Please `#stop` the command first and `#start` it again. ' \ 'Alternatively use `#restart`.' raise CommandAlreadyStartedError, end @started = true @process = ProcessRunner.new(command_string.to_a) @stdout_file = Tempfile.new('aruba-stdout-') @stderr_file = Tempfile.new('aruba-stderr-') @stdout_file.sync = true @stderr_file.sync = true @stdout_file.set_encoding('ASCII-8BIT') @stderr_file.set_encoding('ASCII-8BIT') @exit_status = nil before_run @process.stdout = @stdout_file @process.stderr = @stderr_file @process.cwd = @working_directory @process.environment = environment begin @process.start sleep startup_wait_time rescue SystemCallError => e raise LaunchError, "It tried to start #{commandline}. " + e. end after_run yield self if block_given? end |
#stderr(opts = {}) ⇒ String
Access to stderr of process
226 227 228 229 230 231 232 233 |
# File 'lib/aruba/processes/spawn_process.rb', line 226 def stderr(opts = {}) return @stderr_cache if stopped? wait_for_io opts.fetch(:wait_for_io, io_wait_timeout) do @process.stderr.flush open(@stderr_file.path).read end end |
#stdin ⇒ Object
Access to stdin of process
191 192 193 194 195 |
# File 'lib/aruba/processes/spawn_process.rb', line 191 def stdin return if @process.exited? @process.io.stdin end |
#stdout(opts = {}) ⇒ String
Access to stdout of process
207 208 209 210 211 212 213 214 |
# File 'lib/aruba/processes/spawn_process.rb', line 207 def stdout(opts = {}) return @stdout_cache if stopped? wait_for_io opts.fetch(:wait_for_io, io_wait_timeout) do @process.stdout.flush open(@stdout_file.path).read end end |
#stop ⇒ Object
Stop command
252 253 254 255 256 257 258 |
# File 'lib/aruba/processes/spawn_process.rb', line 252 def stop(*) return @exit_status if stopped? @process.poll_for_exit(@exit_timeout) or @timed_out = true terminate end |
#terminate ⇒ Object
Terminate command
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
# File 'lib/aruba/processes/spawn_process.rb', line 266 def terminate return @exit_status if stopped? unless @process.exited? if @stop_signal # send stop signal ... send_signal @stop_signal # ... and set the exit status wait else begin @process.stop rescue Errno::EPERM # This can occur on MacOS nil end end end @exit_status = @process.exit_code @stdout_cache = read_temporary_output_file @stdout_file @stderr_cache = read_temporary_output_file @stderr_file @started = false @exit_status end |
#wait ⇒ Object
Wait for command to finish
261 262 263 |
# File 'lib/aruba/processes/spawn_process.rb', line 261 def wait @process.wait end |
#write(input) ⇒ Object
235 236 237 238 239 240 241 242 |
# File 'lib/aruba/processes/spawn_process.rb', line 235 def write(input) return if stopped? @process.stdin.write(input) @process.stdin.flush self end |