Module: Tasks

Defined in:
lib/tasks.rb

Class Method Summary collapse

Class Method Details

.kill_children(parent_pid) ⇒ Object

Kills a process’s all children

require 'lib/tasks'; include Tasks
pid = spawn 'sleep 10 | head'
kill_children(pid)

system 'ps aux | grep slee'


43
44
45
46
47
48
49
50
51
52
# File 'lib/tasks.rb', line 43

def kill_children(parent_pid)
  a = `ps ax -o pid,command,ppid`.split(/\n/)[1..-1]
  pss = a.map {|i| i.strip.split(/\s+/, 3) }.select {|i| i[1].to_i == parent_pid }.map {|i| i[0] }
  pss.each {|i|
    begin
      Process.kill 'KILL', i.to_i
    rescue Errno::ESRCH => e
    end
  }
end

.love_pact(master, slave, interval = 2) ⇒ Object



28
29
30
31
32
33
34
35
# File 'lib/tasks.rb', line 28

def love_pact(master, slave, interval = 2)
  loop {
    Process.kill 0, master
    sleep interval
  }
rescue Errno::ESRCH
  Process.kill "KILL", slave
end

.spawn(cmd) ⇒ Object

Tasks.spawn spawns a new process.

This code is almost equivalent to the following code:

def spawn(*cmd)
  fork { exec(*cmd) }
end

But Tasks.spawn doesn’t use exec() for avoiding making new process.

e.g. spawn(‘sleep 100 | echo’) generates the following two processes:

  • sh -c ‘sleep 100 | echo’

  • sleep 10



18
19
20
21
22
23
24
25
26
# File 'lib/tasks.rb', line 18

def spawn(cmd)
  a = IO.popen(cmd)
  fork do
    while b = a.gets
      puts b
    end
  end
  a.pid
end