В моем проекте Ruby on Rails у меня 3 рабочих. Они находятся в /lib/workers/worker_a.rb
, /lib/workers/worker_b.rb
и /lib/workers/worker_c.rb
.
Рабочий A определен как
class WorkerA
def run!
logger.info "Starting worker A"
loop do
begin
do workerAWork
sleep 1.5 if workerAWork
rescue => e
logger.error e
sleep 3
end
end
end
end
WorkerA.new.run! if __FILE__==$0
Рабочий B определен очень похоже:
class WorkerB
def run!
logger.info "Starting Worker B"
loop do
begin
do workerBWork
sleep 1.5 if workerBWork
rescue => e
logger.error e
sleep 3
end
end
end
end
WorkerA.new.run! if __FILE__==$0
Рабочий C снова определен, как указано выше.
Все 3 работника делают то, что требуется от приложения. Однако при развертывании с использованием Docker мне нужно будет открыть 3 терминала и запустить каждого работника, используя bin/rails runner ./lib/workers/worker_a.rb
, bin/rails runner ./lib/workers/worker_b.rb
, bin/rails runner ./lib/workers/worker_c.rb
.
Если я создаю сценарий оболочки, который выглядит как
bin/rails runner ./lib/workers/worker_a.rb
bin/rails runner ./lib/workers/worker_b.rb
bin/rails runner ./lib/workers/worker_c.rb
Запустится только первый рабочий, и терминал будет зависать там, как и все oop. L oop не позволит рабочим B и C запускаться.
Есть ли способ написать сценарий так, чтобы его можно было запускать один за другим?
Спасибо!