Module: Eye::System

Defined in:
lib/eye/system.rb

Class Method Summary collapse

Class Method Details

.check_pid_alive(pid) ⇒ Object

Check that pid really exits very fast return result hash



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/eye/system.rb', line 10

def check_pid_alive(pid)
  res = if pid
    ::Process.kill(0, pid)
  else
    false
  end

  {:result => res}
rescue => ex
  {:error => ex}
end

.daemonize(cmd, cfg = {}) ⇒ Object

Daemonize cmd, and detach options:

:pid_file
:working_dir
:environment
:stdin, :stdout, :stderr


57
58
59
60
61
62
63
64
65
66
67
# File 'lib/eye/system.rb', line 57

def daemonize(cmd, cfg = {})
  pid = ::Process::spawn(prepare_env(cfg), *Shellwords.shellwords(cmd), spawn_options(cfg))

  {:pid => pid, :exitstatus => 0}

rescue Errno::ENOENT, Errno::EACCES => ex
  {:error => ex}

ensure
  Process.detach(pid) if pid
end

.execute(cmd, cfg = {}) ⇒ Object

Execute cmd with blocking, return status (be careful: inside actor blocks it mailbox, use with defer) options

:working_dir
:environment
:stdin, :stdout, :stderr


74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/eye/system.rb', line 74

def execute(cmd, cfg = {})
  pid = ::Process::spawn(prepare_env(cfg), *Shellwords.shellwords(cmd), spawn_options(cfg))

  timeout = cfg[:timeout] || 1.second
  status = 0

  Timeout.timeout(timeout) do
    _, st = Process.waitpid2(pid)
    status = st.exitstatus || st.termsig
  end

  {:pid => pid, :exitstatus => status}

rescue Timeout::Error => ex
  if pid
    warn "[#{cfg[:name]}] sending :KILL signal to <#{pid}> due to timeout (#{timeout}s)"
    send_signal(pid, 9)
  end
  {:error => ex}

rescue Errno::ENOENT, Errno::EACCES => ex
  {:error => ex}

ensure
  Process.detach(pid) if pid
end

.normalized_file(file, working_dir = nil) ⇒ Object

normalize file



102
103
104
# File 'lib/eye/system.rb', line 102

def normalized_file(file, working_dir = nil)
  Pathname.new(file).expand_path(working_dir).to_s
end

.pid_alive?(pid) ⇒ Boolean

Check that pid really exits very fast return true/false

Returns:

  • (Boolean)


25
26
27
28
# File 'lib/eye/system.rb', line 25

def pid_alive?(pid)
  res = check_pid_alive(pid)
  !!res[:result]
end

.send_signal(pid, code = :TERM) ⇒ Object

Send signal to process (uses for kill) code: TERM(15), KILL(9), QUIT(3), …



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/eye/system.rb', line 32

def send_signal(pid, code = :TERM)
  code = 0 if code == '0'
  if code.to_s.to_i != 0
    code = code.to_i
    code = -code if code < 0
  end
  code = code.to_s.upcase if code.is_a?(String) || code.is_a?(Symbol)

  if pid
    ::Process.kill(code, pid)
    {:result => :ok}
  else
    {:error => Exception.new('no_pid')}
  end

rescue => ex
  {:error => ex}
end