Как лучше всего поставить в очередь длительную задачу

Итак, у меня есть плагин, который запускает Ansible для установки Discourse (я очень, очень хочу перестать использовать WordPress для приема заказов на установку!).

Изначально я вызывал fork для запуска процесса, что работало нормально при тестировании, но я подумал, что стоит сделать это более «по-дискурсовски».

Затем я создал одноразовую задачу для запуска процесса, но она завершается с ошибкой так:

E, [2020-12-16T12:53:39.662683 #3158277] ERROR -- : worker=0 PID:3158425 timeout (61s > 60s), killing

Я попробовал добавить sidekiq_options queue: 'low' в класс, а затем в функцию, выполняющую задачу.

Затем я отказался от запуска процесса через задачу и просто выполнил его напрямую в модели с помощью:

         Discourse::Utils.execute_command(*instructions)

Это работает отлично, если запускать из rails c, но как бы я ни запускал это (это среда разработки Ubuntu, запущенная с помощью ./bin/unicorn), процесс завершается.

Одноразовые задачи — это задачи, которые выполняются ровно один раз. Похоже, вам нужна обычная задача, которая будет запускаться по триггеру, например, при поступлении запроса к контроллеру.

Обычные задачи могут выполняться дольше 60 секунд, как это происходит в обычной работе.

Ну, я перенес это на обычную задачу и попробовал запустить через ./bin/rails s вместо ./bin/unicorn, но всё равно ничего не вышло.

Это не имеет смысла, потому что я знаю, что многие из этих задач занимают больше минуты.

Как именно вы запускаете задачу? Можете ли вы вставить соответствующую часть кода на Ruby?

Ещё бы!

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/jobs/regular/create_droplet.rb

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/models/pfaffmanager/server.rb#L150-L172

Почему вы используете

Jobs::CreateDroplet.new.execute(server_id: id)

вместо

Jobs.enqueue(:create_droplet, server_id: id)

в https://github.com/pfaffman/discourse-pfaffmanager/blob/49f7369b1dc0b1c8f63065b14c92ac7ecc3ab2b3/app/models/pfaffmanager/server.rb#L146?

Именно поэтому мне нужно задавать вопросы! Потому что я просто пещерный человек. (Никакого оскорбления тем, кто живёт в пещере, не подразумевается.)

Конечно, никакой причины нет. Я просто не мог понять, как мне это нужно вызывать!

Огромное спасибо!

… и оно всё ещё работает! …

Огромное спасибо. Это заняло как минимум пару часов…

Следующий шаг: запустить это на реальном продакшн-сервере…