Форман завершает работу после всего процесса и не запускается соответствующим образом, как определено в Procfile
Я работаю над импортом данных из веб-интерфейса CSV в базу данных, поэтому я создал задачу rake, которая импортирует данные в базу данных. Тем не менее, я попытался сделать приложение для моих рельсов более легким и интегрировал import rake task
а также running rails server
в мастера
Тем не менее, когда я бегу foreman start
процессы запускаются, но завершаются после завершения задачи rake. Мне также понравится, что эта задача с граблями должна начинаться сначала rails s
Вот что я сделал ниже:
Lib / задачи / web_import.rake
require 'open-uri'
require 'csv'
namespace :web_import do
desc 'Import users from csv'
task users: :environment do
url = 'http://blablabla.com/content/people.csv'
# I forced encoding so avoid UndefinedConversionError "\xC3" from ASCII-8BIT to UTF-8
csv_string = open(url).read.force_encoding('UTF-8')
counter = 0
duplicate_counter = 0
user = []
CSV.parse(csv_string, headers: true, header_converters: :symbol) do |row|
next unless row[:name].present? && row[:email_address].present?
user = CsvImporter::User.create row.to_h
if user.persisted?
counter += 1
else
duplicate_counter += 1
end
end
p "Email duplicate record: #{user.email_address} - #{user.errors.full_messages.join(',')}" if user.errors.any?
p "Imported #{counter} users, #{duplicate_counter} duplicate rows ain't added in total"
end
end
PROCFILE
rake: rake web_import:users
server: rails s
когда я запускаю forman start, изображение ниже показывает процесс
Мне понравится rake
задача в мастере, чтобы запустить в первую очередь перед запуском rails s
команда. Я также не хочу, чтобы это прекратилось само по себе. Я не знаю, что делаю не так.
Любая помощь приветствуется.
2 ответа
Я решил это путем рефакторинга Procfile. Вместо двух задач я объединил его в одну команду, используя &&
поэтому я могу определить, какая команда принимает префикс, а какая - суффикс.
Поэтому я изменил профиль на:
tasks: rake web_import:users && rails s -p 3000
При этом мой импорт запускается первым, а команда сервера - последней.
Если вы заметили, я добавил порт с -p
flap, чтобы не убедиться, что сервер прослушивает порт 3000. Обратите внимание, добавление порта не является обязательным.
Надеюсь, это кому-то тоже поможет.
Добавлять&& until ! sleep 1; do sleep 1; done
до конца любой команды Procfile, которая завершает работу, что приводит к завершению всех процессов профиля.
Другими словами, вы навсегда сохраняете «процесс», который запускал команду. Это не идеально, но для локальной разработки, когда вам нужна какая-то команда для запуска, завершения работы, но не выхода из-под контроля Procfile, это может сработать.
Вот пример фрагмента моего файла procfile, в котором я копирую примеры файлов конфигурации в места, где они нужны моим дозорным процессам Redis.
redis-sentinel-config: cp -f spec/support/config/redis/sentinel1.EXAMPLE.conf spec/support/config/redis/sentinel1.conf && cp -f spec/support/config/redis/sentinel2.EXAMPLE.conf spec/support/config/redis/sentinel2.conf && cp -f spec/support/config/redis/sentinel3.EXAMPLE.conf spec/support/config/redis/sentinel3.conf && until ! sleep 1; do sleep 1; done
redis-senitnel1: sleep 1 && redis-server spec/support/config/redis/sentinel1.conf --sentinel
redis-senitnel2: sleep 1 && redis-server spec/support/config/redis/sentinel2.conf --sentinel
redis-senitnel3: sleep 1 && redis-server spec/support/config/redis/sentinel3.conf --sentinel