lib/gdk/diagnostic/port_in_use.rb (41 lines of code) (raw):
# frozen_string_literal: true
module GDK
module Diagnostic
class PortInUse < Base
TITLE = 'Port required by GDK is already in use'
def success?
!port_in_use?
end
def detail
return if success?
<<~MSG
Port #{port} is currently in use by another process.
This can happen if GDK was previously running and the directory was deleted before stopping it.
In that case, some processes may still be running in the background and blocking the port.
To fix this:
1. Run `lsof -i @#{listen_address}:#{port}` to see which processes are using the port
2. Use `kill -9 <PID>` to stop them
3. Run `lsof -i @#{listen_address}:#{port}` again to confirm the port is free
Once the port is no longer in use, try starting GDK again.
MSG
end
private
def port_in_use?
pids = run("lsof -ti @#{listen_address}:#{port}").lines.map(&:strip).reject(&:empty?)
return false if pids.empty?
pids.any? do |pid|
cmd = run("ps -p #{pid} -o args=").strip
!cmd.include?(GDK.root.to_s)
end
end
def listen_address
GDK.config.listen_address
end
def port
GDK.config.port
end
def run(command)
Shellout.new(command, chdir: GDK.root).run
end
end
end
end