Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Commit 0774f41

Browse files
committed
Detect zombie processes
1 parent 8ff81d0 commit 0774f41

File tree

1 file changed

+38
-12
lines changed

1 file changed

+38
-12
lines changed

spec/integration/bisect_spec.rb

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,47 @@ def bisect(cli_args, expected_status=nil)
4343
end
4444

4545
it 'does not leave zombie processes', :unless => RSpec::Support::OS.windows? do
46-
original_pids = pids()
47-
bisect(%W[spec/rspec/core/resources/blocking_pipe_bisect_spec.rb_], 1)
48-
cursor = 0
49-
while ((extra_pids = pids() - original_pids).join =~ /[RE]/i)
50-
raise "Extra process detected" if cursor > 10
51-
cursor += 1
52-
sleep 0.1
53-
end
54-
expect(extra_pids.join).to_not include "Z"
46+
bisect(['--format', 'json', 'spec/rspec/core/resources/blocking_pipe_bisect_spec.rb_'], 1)
47+
48+
zombie_process = RSpecChildProcess.new(Process.pid).zombie_process
49+
expect(zombie_process).to eq([]), <<-MSG
50+
Expected no zombie processes got #{zombie_process.count}:
51+
#{zombie_process}
52+
MSG
5553
end
5654
end
5755

58-
def pids
59-
%x[ps -ho pid,state,cmd | grep "[r]uby"].split("\n").map do |line|
60-
line.split(/\s+/).compact.join(' ')
56+
class RSpecChildProcess
57+
Ps = Struct.new(:pid, :ppid, :state, :command)
58+
59+
def initialize(pid)
60+
@list = child_process_list(pid)
61+
end
62+
63+
def zombie_process
64+
@list.select { |child_process| child_process.state =~ /Z/ }
65+
end
66+
67+
private
68+
69+
def child_process_list(pid)
70+
childs_process_list = []
71+
ps_pipe = `ps -o pid=,ppid=,state=,cmd= | grep #{pid}`
72+
73+
ps_pipe.split(/\n/).map do |line|
74+
ps_part = line.lstrip.split(/\s+/)
75+
76+
next unless ps_part[1].to_i == pid
77+
78+
child_process = Ps.new
79+
child_process.pid = ps_part[0]
80+
child_process.ppid = ps_part[1]
81+
child_process.state = ps_part[2]
82+
child_process.command = ps_part[3..-1].join(' ')
83+
84+
childs_process_list << child_process
85+
end
86+
childs_process_list
6187
end
6288
end
6389
end

0 commit comments

Comments
 (0)