komagataのブログ

git worktreeで同じサーバーアプリをを複数チェックアウトして並行で動かそうとするとポートが衝突してだるい。

「3000〜3100の範囲で最初に空いてるポートを返す」を1ライナーで書くと下記、

$ comm -23 <(seq 3000 3100) <(ss -tlnH | awk -F: '{print $NF+0}' | sort -un) | head -1
3000

rubyのメソッドとして書くと下記、

require 'socket'

def find_free_port(range = 3000..3100)
  range.find { |p| (TCPServer.new(p).close; true) rescue false }
end

localhostへのbindはちょっぱやで100個見ても数msしかかからないらしいので気軽に探せる。

worktreeに適用する場合は、空いてるポートを環境変数に設定しつつworktreeを作って、アプリ側ではそれを見て起動ポートを決めればいい。

Comments


Option