Форман завершает работу после всего процесса и не запускается соответствующим образом, как определено в 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
Другие вопросы по тегам