Почему не будет тонкого запуска в порт, который я укажу?

Я [неправильно] управляю худшими работниками с богом и получаю неожиданный результат, который мне не удается диагностировать. Мой божественный блок watch довольно прост:

(1..4).each do |index|
 God.watch do |w|
 name = "thin-#{index}"
 port = 8300 + index
 pid_name = "thin.#{port}.pid"
 pid_path = God.pid_file_directory.join pid_name

 # General settings.
 w.name = name
 w.interval = 5.seconds
 w.pid_file = pid_name

 # Configuration for thin instances.
 start_options = {
 address: '0.0.0.0',
 environment: RAILS_ENV,
 only: index,
 port: port,
 }.inject("") { |s,(k,v)| s << " --#{k}=#{v}" }

 # Process management commands.
 bin = "/vagrant/bin/thin -c #{RAILS_ROOT}"
 w.start = "#{bin} #{start_options} start"
 w.restart = "#{bin} --pid #{pid_path} restart"
 w.stop = "#{bin} --pid #{pid_path} stop"

 # Management conditions.
 w.start_if do |start|
 start.condition(:process_running) do |c|
 # Ensure the worker is running.
 c.interval = 5.seconds
 c.running = false
 end
 end

 end
end

И он будет запускать 4 тонких сервера, но на неправильных портах. Здесь вывод из режима god в режиме отладки:

vagrant@localhost:/vagrant$ RAILS_ENV=development god -c config/app.god -D
I [2014-04-30 18:27:05] INFO: Loading config/app.god
I [2014-04-30 18:27:05] INFO: Syslog enabled.
I [2014-04-30 18:27:05] INFO: Using pid file directory: /vagrant/tmp/pids
I [2014-04-30 18:27:06] INFO: Started on drbunix:///tmp/god.17165.sock
I [2014-04-30 18:27:06] INFO: thin-1 move 'unmonitored' to 'up'
I [2014-04-30 18:27:06] INFO: thin-1 moved 'unmonitored' to 'up'
I [2014-04-30 18:27:06] INFO: thin-3 move 'unmonitored' to 'up'
I [2014-04-30 18:27:06] INFO: thin-4 move 'unmonitored' to 'up'
I [2014-04-30 18:27:06] INFO: thin-4 moved 'unmonitored' to 'up'
I [2014-04-30 18:27:06] INFO: thin-2 move 'unmonitored' to 'up'
I [2014-04-30 18:27:06] INFO: thin-3 moved 'unmonitored' to 'up'
I [2014-04-30 18:27:06] INFO: thin-2 moved 'unmonitored' to 'up'
I [2014-04-30 18:27:06] INFO: thin-1 [trigger] process is not running (ProcessRunning)
I [2014-04-30 18:27:06] INFO: thin-3 [trigger] process is not running (ProcessRunning)
I [2014-04-30 18:27:06] INFO: thin-4 [trigger] process is not running (ProcessRunning)
I [2014-04-30 18:27:06] INFO: thin-1 move 'up' to 'start'
I [2014-04-30 18:27:06] INFO: thin-3 move 'up' to 'start'
I [2014-04-30 18:27:06] INFO: thin-4 move 'up' to 'start'
I [2014-04-30 18:27:06] INFO: thin-4 start: /vagrant/bin/thin -c /vagrant --address=0.0.0.0 --environment=development --only=4 --port=8304 start
I [2014-04-30 18:27:06] INFO: thin-2 [trigger] process is not running (ProcessRunning)
I [2014-04-30 18:27:06] INFO: thin-2 move 'up' to 'start'
I [2014-04-30 18:27:06] INFO: thin-1 start: /vagrant/bin/thin -c /vagrant --address=0.0.0.0 --environment=development --only=1 --port=8301 start
I [2014-04-30 18:27:06] INFO: thin-3 start: /vagrant/bin/thin -c /vagrant --address=0.0.0.0 --environment=development --only=3 --port=8303 start
I [2014-04-30 18:27:06] INFO: thin-2 start: /vagrant/bin/thin -c /vagrant --address=0.0.0.0 --environment=development --only=2 --port=8302 start

Но вместо того, чтобы мои тонкие серверы прослушивали 830 {1,2.3.4}, они вместо этого прослушивают 830 {2,4,6.8}:

vagrant@localhost:/vagrant$ ps aux | grep thin
vagrant 4535 49.8 2.3 113712 83936 ? Sl 18:27 0:03 thin server (0.0.0.0:8306) 
vagrant 4541 51.4 2.3 113464 83716 ? Sl 18:27 0:03 thin server (0.0.0.0:8304) 
vagrant 4547 55.5 2.3 113276 83504 ? Sl 18:27 0:03 thin server (0.0.0.0:8302) 
vagrant 4553 54.2 2.3 113740 83928 ? Sl 18:27 0:03 thin server (0.0.0.0:8308) 
vagrant 4569 0.0 0.0 3912 828 pts/0 S+ 18:27 0:00 grep --color=auto thin

Все мои файлы pid, записи в журнале и т.д. Показывают номера {2.4.6,8}. Учитывая мой код и отладочную информацию от бога, я думаю, что с тобой что-то не так, но я понятия не имею, что искать.

Кроме того, эта схема (база + 2,4,6,8 вместо базы + 1,2,3,4) повторяема - например, если я установил базу порта на 5555, результаты не будут 5556, 5557, 5558 и 5559 вместо 5557, 5559, 5561 и 5563.

Я что-то пропустил из тонкой документации? Есть ли какой-то конфликт, и мне нужно сказать богу, чтобы разбить start команды на несколько секунд? Существуют ли дополнительные диагностические инструменты, которые я мог бы использовать? Я застрял в грязи здесь.

EDIT1

Если попытаться "пойти с потоком" и изменить

(1..4).each do |index|

в

[2,4,6,8].each do |index|

то вместо {2,4,6,8} я получаю {4,8,12,16}, что оставляет меня таким же смущенным, как раньше.

EDIT2

Теперь я уверен, что это не имеет никакого отношения к богу, поэтому я меняю вопрос. Здесь новые доказательства:

vagrant@localhost:/vagrant$ /vagrant/bin/thin -c /vagrant --address=0.0.0.0 --environment=development --only=1 --port=8301 --servers=1 start
Starting server on 0.0.0.0:8302 ...

Почему тонкий отказ начинать в порту, который я прошу?

EDIT3

Разбивая это на самый простой случай, я нахожу виновника:

vagrant@localhost:/vagrant$ /vagrant/bin/thin -c /vagrant --port=8301 start
Using rack adapter
Thin web server (v1.6.2 codename Doc Brown)
Maximum connections set to 1024
Listening on 0.0.0.0:8301, CTRL+C to stop
^CStopping ...
vagrant@localhost:/vagrant$ /vagrant/bin/thin -c /vagrant --only=1 --port=8301 start
Starting server on 0.0.0.0:8302 ... 
vagrant@localhost:/vagrant$ ^C

Поэтому по какой-либо причине директива --only вызывает неправильное поведение в отношении привязки к порту. Проблема в том, что я теряю контроль над тем, где тонкий помещает свой файл pid, когда я не --only=1.

1 ответ

Нашел ответ где-то между всеми вещами, которые я пробовал. В окончательной форме у меня есть следующее:

# Configuration for thin servers.
start_options = {
 address: '0.0.0.0',
 chdir: RAILS_ROOT,
 environment: RAILS_ENV,
 port: port,
}.inject("") { |s,(k,v)| s << " --#{k}=#{v}" }

# Process management commands.
bin = "/vagrant/bin/thin"
# NOTE: pid not specified during start
w.start = "#{bin} #{start_options} start"
# NOTE: pid specified for restart and stop
w.restart = "#{bin} --pid tmp/pids/thin-#{index}.pid restart"
w.stop = "#{bin} --pid tmp/pids/thin-#{index}.pid stop"

Установка God.pid_file_directory = 'tmp/pids' при w.pid_file позволяет богу размещать файлы pid "естественно" (например, на основе имени процесса, такого как tmp/pids/thin-1.pid). Также важно, чтобы w.start опускал --pid, --daemonize и --only чтобы предотвратить тонкое от демонализации и кластеризации. В этой настройке бог обрабатывает все эти детали, поэтому мне нужно уклоняться от попытки перехитрить себя.

Мои предыдущие конфигурации затрудняли это чистое разделение, и результат заключался в том, что бог пытался управлять тонким, но тонкий также пытался управлять собой. Подобно тому, как властный родитель в кричащем матче с мятежным подростком, чем больше контроль над каждой попыткой повлиять на ситуацию, тем более скрученной и неустойчивой стала общая система.

Последний фрагмент головоломки, который позволяет полностью контролировать процесс через божество, заключается в том, что --pid (хотя и не указано во время start) должен быть передан тонким во время restart а stop --pid не знает, какой процесс должен сигнализировать в этой точке без PID, так как Бог (правильно) управляет демонанизацией.

licensed under cc by-sa 3.0 with attribution.