Вы можете проверить, используется ли порт, попытавшись прослушать порт, прежде чем позволить Sinatra и Puma вступить во владение.Это не на 100% эффективно, потому что есть состояние гонки, при котором вы можете открывать и закрывать порт, но до завершения инициализации Sinatra / Puma приходит какой-то другой процесс, который прослушивает тот же порт, но он должен работать в вашем случае использования (который выглядит как косметический хак).
Вставьте этот код в любое место в test.rb
:
require 'socket'
include Socket::Constants
begin
# Open and close the port
socket = Socket.new(AF_INET, SOCK_STREAM, 0)
sockaddr = Socket.pack_sockaddr_in(3000, '0.0.0.0')
socket.bind(sockaddr)
socket.listen(1)
socket.close
rescue Errno::EADDRINUSE => error
# Traps the same error that is trapped by Sinatra and exits if raised
puts error.message
exit
end
Начните первый с ruby test.rb
:
== Sinatra (v2.0.4) has taken the stage on 3000 for development with backup from Puma
Puma starting in single mode...
* Version 3.12.0 (ruby 2.6.0-p-1), codename: Llamas in Pajamas
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
Начните второй с ruby test.rb
:
Address already in use - bind(2) for 0.0.0.0:3000
Вы можете выделить то, что вы хотите напечатать на консоли внутри блока rescue
.