Class: RailsBuild::Assassin
- Inherits:
-
Object
- Object
- RailsBuild::Assassin
- Defined in:
- lib/rails_build.rb
Instance Attribute Summary collapse
-
#child_pid ⇒ Object
Returns the value of attribute child_pid.
-
#parent_pid ⇒ Object
Returns the value of attribute parent_pid.
-
#path ⇒ Object
Returns the value of attribute path.
-
#pid ⇒ Object
Returns the value of attribute pid.
Class Method Summary collapse
- .ate(*args, &block) ⇒ Object
- .generate(child_pid, options = {}) ⇒ Object
- .options_for(options) ⇒ Object
- .script_for(child_pid, options = {}) ⇒ Object
Instance Method Summary collapse
-
#initialize(child_pid, options = {}) ⇒ Assassin
constructor
A new instance of Assassin.
Constructor Details
#initialize(child_pid, options = {}) ⇒ Assassin
Returns a new instance of Assassin.
144 145 146 147 148 149 |
# File 'lib/rails_build.rb', line 144 def initialize(child_pid, = {}) @child_pid = child_pid.to_s.to_i @parent_pid = Process.pid @options = Assassin.() @pid, @path = Assassin.generate(@child_pid, @options) end |
Instance Attribute Details
#child_pid ⇒ Object
Returns the value of attribute child_pid.
140 141 142 |
# File 'lib/rails_build.rb', line 140 def child_pid @child_pid end |
#parent_pid ⇒ Object
Returns the value of attribute parent_pid.
139 140 141 |
# File 'lib/rails_build.rb', line 139 def parent_pid @parent_pid end |
#path ⇒ Object
Returns the value of attribute path.
142 143 144 |
# File 'lib/rails_build.rb', line 142 def path @path end |
#pid ⇒ Object
Returns the value of attribute pid.
141 142 143 |
# File 'lib/rails_build.rb', line 141 def pid @pid end |
Class Method Details
.ate(*args, &block) ⇒ Object
135 136 137 |
# File 'lib/rails_build.rb', line 135 def Assassin.ate(*args, &block) new(*args, &block) end |
.generate(child_pid, options = {}) ⇒ Object
155 156 157 158 159 160 161 |
# File 'lib/rails_build.rb', line 155 def Assassin.generate(child_pid, = {}) path = File.join(Dir.tmpdir, "assassin-#{ child_pid }-#{ SecureRandom.uuid }.rb") script = Assassin.script_for(child_pid, ) IO.binwrite(path, script) pid = Process.spawn "ruby #{ path }" [pid, path] end |
.options_for(options) ⇒ Object
151 152 153 |
# File 'lib/rails_build.rb', line 151 def Assassin.() .inject({}){|h, kv| k,v = kv; h.update(k.to_s.to_sym => v)} end |
.script_for(child_pid, options = {}) ⇒ Object
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 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/rails_build.rb', line 163 def Assassin.script_for(child_pid, = {}) parent_pid = Process.pid delay = ([:delay] || 0.42).to_f script = <<-__ Process.daemon require 'fileutils' at_exit{ FileUtils.rm_f(__FILE__) } parent_pid = #{ parent_pid } child_pid = #{ child_pid } delay = #{ delay } m = 24*60*60 n = 42 m.times do begin Process.kill(0, parent_pid) rescue Object => e sleep(delay) if e.is_a?(Errno::ESRCH) n.times do begin Process.kill(15, child_pid) rescue nil sleep(rand + rand) Process.kill(9, child_pid) rescue nil sleep(rand + rand) Process.kill(0, child_pid) rescue Errno::ESRCH break end end end exit end sleep(1) end __ return script end |