LINUX.ORG.RU

Подскажите как можно отладить задачи для clockwork

 


0

3

В общем имеется проект с демоном под clockwork. Но там кое-что не работает. Анализ кода ничего не дал - все выглядит хорошо. Значит надо отлаживаться. Но почему-то не получается.

Через clockwork в каждой таске создается очередь задач через Resque.

Подскажите, пожалуйста, как это чудо можно вообще отладить?

★★★★★

Ответ на: комментарий от theNamelessOne

# что такое clockwork, не знаю.

Это типо такая тулза написанная на руби, для нее пишешь сценарии типо на руби с небольшими изменениями (ну там например типо запускать такую функцию каждую минуту).

Запускается это чудо так

bundle exec clockwork .../daemon.rb

Вот мне все этот демон и надо отладить. Пока не понимаю даже как запустить отладчик для руби. Я в руби в новичок, поэтому возможно туплю капитально.

Как пытался отлаживать? puts, pry?

puts и system(«touch .../file.txt»)

Вообще хотелось бы пошаговую отладку, если возможно.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Вообще хотелось бы пошаговую отладку, если возможно.

https://github.com/pry/pry/wiki/Runtime-invocation#Invoke_on_binding

UPD: кажись, для пошаговой отладки нужно будет установить https://github.com/deivid-rodriguez/pry-byebug (https://github.com/nixme/pry-debugger для 1.9.3 и старше).

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Ага, спасибо, вроде сумел. Но почему-то не вызывается задача добавленная в очередь.

Может подскажешь почему не запускается задача если она добавлена через Resque.enqueue_to который не вернул nil (то есть все удачно добавилось как я понял). Но perform метод не вызывается. Ни puts не срабатывает,ни pry туда по брейкпоинту не заходит.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Может подскажешь почему не запускается задача если она добавлена через Resque.enqueue_to который не вернул nil (то есть все удачно добавилось как я понял).

Я ни с clockwork, ни с Resque ещё не сталкивался, но могу завтра посмотреть, если ты покажешь какой-нибудь минимальный (не)рабочий пример, ну и как его запускать.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Окей, чуть позже скину.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne
require "bundler/setup"
require 'resque'
require 'clockwork'
require "yaml"
props = YAML.load_file( "config/redis.yml" )
$redis = Redis.new(:host => props["server"], :port => props["port"], :password => props["password"])
Resque.redis = $redis


def start_task(cls, params = {})
  o = Resque.enqueue_to(:tasks, cls, params)
  if (o == nil)
    puts "Error\n"
  else 
    puts "ok-ok!"
  end
end

module YaYa
  @queue = :tasks
  def self.perform(msg)
   system("touch yaya.txt")
  end

end

  #### DAEMONS ####

module Clockwork
  error_handler do |error|
    puts error.inspect
  end

  configure do |config|
      $logfile = "log/daemon.log"

    config[:sleep_timeout] = 5
    config[:logger] = Logger.new($logfile)
    config[:max_threads] = 21
    config[:thread] = true

  end

  handler do |job|
    puts "Running #{job}"
  end


begin  
  every 1.minutes, "YaYa" do
    puts "1"
    start_task("YaYa", {})
  end
end
end

Нужно еще поставить conf/redis.yml


содержимое server: localhost
password: password

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Хотя я не очень уверен, что я правильно тут Resque использую. Но в остальном коде вроде так используется он. И он работает на продакшен сервере. По идее багает только одна из тасков, я хотел ее отладить, а у меня вообще вроде как и не работает ничего. Пример выше тоже ничего не создает. Странно...

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

Там похоже resque хитрее работает намного, разбираюсь...

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Я долго тупил, пока не понял, что Readme у resque показывается не для стабильной версии.

Как я понял из исходников, отладить отладчиком Resque не получится, т. к. он форкается. Зато можно печатать с помощью Resque.logger.

Ты неправильно передавал класс в Resque.enqueue_to. Тут сказано, что Rescue ожидает именно класс, а не имя класса (классы в Ruby — first-class citizens).

И ещё у меня есть сильное подозрение, что ты не запускал рабочий процесс Resque.

Вот рабочий пример:

lib/task.rb:

require "task/version"
require 'bundler/setup'
require 'resque'
require 'fileutils'

Resque.redis = 'localhost:6379'

module Task
  def self.start(cls, *args)
    raise RuntimeError, "can't enqueue task" unless
      Resque.enqueue_to :tasks, cls, *args
  end
end

class YaYa
  @queue = :tasks

  def self.perform(touch_file, clock_file)
    FileUtils.touch touch_file
    File.open clock_file, 'a' do |clock|
      clock.puts Time.now
    end
  end
end

bin/clock.rb:

require 'task'
require 'clockwork'

module Clockwork
  configure do |config|
    config[:sleep_timeout] = 5
    config[:logger] = Logger.new "/tmp/daemon.log"
    config[:max_threads] = 21
    config[:thread] = true
  end

  every 1.minutes, YaYa do
    Task.start YaYa, '/tmp/yaya.txt', '/tmp/clock.txt'
  end
end

Rakefile:

require "bundler/gem_tasks"
require 'task'
require 'resque/tasks'

Как запускать.

Сначала запускаем Resque worker:

VVERBOSE=1 TERM_CHILD=1 QUEUE=tasks rake resque:work

Затем запускаем clockwork:

bundle exec clockwork bin/clock.rb

После этого YaYa должна заработать.

Немного придирок по коду: сигил $ используется для создания глобальных переменных, а тебе они не нужны; хендлер «Running #{job}» никогда не выполнится.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Спасибо! Еще не смотрел правда, другими задачами второй день завален. Как попробую отпишусь.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

Вроде все ок. Так засыпали другими задачами, что даже током проверить не смог... А теперь вот другая проблема уже с теми же resque-pool и clockwork

Dudraug ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.