Recursively kill dangling child processes using pgrep

This commit is contained in:
Junegunn Choi 2013-09-28 20:29:18 +09:00
parent 3a4ffb49e9
commit 09b2080ddb

View File

@ -380,7 +380,17 @@ function! s:update_parallel(pull, threads)
end
rescue Timeout::Error, Interrupt => e
if fd && !fd.closed?
Process.kill 'KILL', fd.pid
pids = [fd.pid]
unless `which pgrep`.empty?
children = pids
while !children.empty?
children = children.map { |pid|
`pgrep -P #{pid}`.lines.map(&:chomp)
}.flatten
pids += children
end
end
pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
fd.close
end
[false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]