2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-03-03 22:05:52 +08:00
discourse/bin/unicorn
David Taylor 7ebd231be1
DEV: Drop 'bundle exec' perf warning (#37922)
This logic can sometimes have false positives (e.g. when launching
server through bin/qunit --standalone). The performance difference is
negligible compared to the overall Rails boot time, so fixing it is not
a priority.
2026-02-19 12:09:52 +00:00

101 lines
2.5 KiB
Ruby
Executable file

#!/usr/bin/env ruby
# frozen_string_literal: true
if ENV["RUN_PITCHFORK"] != "0"
STDERR.puts "[bin/unicorn] Running bin/pitchfork. Use RUN_PITCHFORK=0 to run unicorn instead."
exec File.expand_path("pitchfork", __dir__), *ARGV
end
require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath)
require "rubygems"
require "bundler/setup"
require "fileutils"
dev_mode = false
# in development do some fussing around, to automate config
if !ARGV.include?("-E") && !ARGV.include?("--env") &&
(%w[development test].include?(ENV["RAILS_ENV"]) || !ENV["RAILS_ENV"])
dev_mode = true
ARGV.push("-N")
if !ARGV.include?("-c") && !ARGV.include?("--config-file")
ARGV.push("-c")
ARGV.push(File.expand_path("../../config/unicorn.conf.rb", Pathname.new(__FILE__).realpath))
end
# we do not want to listen on 2 ports, so lets fix it
if (idx = ARGV.index("-p")) && (port = ARGV[idx + 1].to_i) > 0
ENV["UNICORN_PORT"] ||= port.to_s
end
ENV["UNICORN_PORT"] ||= "9292"
if ARGV.delete("-x")
puts "Running without sidekiq"
ENV["UNICORN_SIDEKIQS"] = "0"
end
ENV["UNICORN_SIDEKIQS"] ||= "1"
end
if ARGV.include?("--help")
fork { load Gem.bin_path("unicorn", "unicorn") }
Process.wait
puts "Extra Discourse Options:"
puts " -x run without sidekiq"
exit
end
# this dev_mode hackery enables the following to be used to restart unicorn:
#
# pkill -USR2 -f 'ruby bin/unicorn'
#
# This is handy if you want to bind a key to restarting unicorn in dev
if dev_mode
UNICORN_DEV_SUPERVISOR_PID = Process.pid
restart = true
while restart
restart = false
pid =
fork do
begin
load Gem.bin_path("unicorn", "unicorn")
rescue ArgumentError => err
if (err.message =~ /Already running on PID/)
puts "\n"
puts "Unicorn is already running!\n"
pid = err.message[/PID:(\d+)/, 1]&.to_i
puts "\n"
puts "kill -9 #{pid} to stop the existing unicorn master process, then try again."
else
raise err
end
end
end
done = false
Signal.trap("INT") do
# wait for parent to be done
end
Signal.trap("USR2") do
Process.kill("QUIT", pid)
puts "RESTARTING UNICORN"
restart = true
end
Signal.trap("TERM") { Process.kill("TERM", pid) }
while !done
sleep 1
done = Process.waitpid(pid, Process::WNOHANG)
end
end
else
load Gem.bin_path("unicorn", "unicorn")
end