Method: Bluepill::Process#stop_process

Defined in:
lib/bluepill/process.rb

#stop_processObject



309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
# File 'lib/bluepill/process.rb', line 309

def stop_process
  if monitor_children
    System.get_children(self.actual_pid).each do |child_pid|
      ProcessJournal.append_pid_to_journal(name, child_pid)
    end
  end

  if stop_command
    cmd = self.prepare_command(stop_command)
    logger.warning "Executing stop command: #{cmd}"

    with_timeout(stop_grace_time, "stop") do
      result = System.execute_blocking(cmd, self.system_command_options)

      unless result[:exit_code].zero?
        logger.warning "Stop command execution returned non-zero exit code:"
        logger.warning result.inspect
      end
    end

  elsif stop_signals
    # issue stop signals with configurable delay between each
    logger.warning "Sending stop signals to #{actual_pid}"
    @threads << Thread.new(self, stop_signals.clone) do |process, stop_signals|
      signal = stop_signals.shift
      logger.info "Sending signal #{signal} to #{process.actual_pid}"
      process.signal_process(signal) # send first signal

      until stop_signals.empty?
        # we already checked to make sure stop_signals had an odd number of items
        delay = stop_signals.shift
        signal = stop_signals.shift

        logger.debug "Sleeping for #{delay} seconds"
        sleep delay
        #break unless signal_process(0) #break unless the process can be reached
        unless process.signal_process(0)
          logger.debug "Process has terminated."
          break
        end
        logger.info "Sending signal #{signal} to #{process.actual_pid}"
        process.signal_process(signal)
      end
    end
  else
    logger.warning "Executing default stop command. Sending TERM signal to #{actual_pid}"
    signal_process("TERM")
  end
  ProcessJournal.kill_all_from_journal(name) # finish cleanup
  self.unlink_pid # TODO: we only write the pid file if we daemonize, should we only unlink it if we daemonize?

  self.skip_ticks_for(stop_grace_time)
end