30 lines
874 B
Ruby
30 lines
874 B
Ruby
|
#!/usr/bin/env ruby
|
||
|
require 'open3'
|
||
|
|
||
|
# Wait until the given PID had no network activity for `Timeout` seconds, then exit.
|
||
|
|
||
|
pid = ARGV.first
|
||
|
Timeout = 2
|
||
|
|
||
|
stdin, out, err, wait_thread = Open3.popen3("strace -f -e trace=network -s 1 -q -p #{pid}")
|
||
|
while IO.select([err], nil, nil, Timeout)
|
||
|
begin
|
||
|
out = err.read_nonblock(1 << 10)
|
||
|
rescue EOFError
|
||
|
status = wait_thread.value
|
||
|
if status.success?
|
||
|
puts "Monitored process #{pid} exited"
|
||
|
exit 0
|
||
|
else
|
||
|
puts "Strace failed with exit code #{status.to_i}. Last output:\n#{out}"
|
||
|
# strace often fails with code 256 which looks like success to shells. fail with 1 instead.
|
||
|
exit 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# If we exit without an explicit kill,
|
||
|
# ptrace can fail on reattachment: ptrace(PTRACE_SEIZE, $PID): Operation not permitted
|
||
|
# Only relevant for testing.
|
||
|
Process.kill("TERM", wait_thread.pid)
|