Работает всякий раз, когда cron в Windows - PullRequest
1 голос
/ 15 августа 2011

Абсолютно новичок в cronjobs и тому подобное, никогда не делал этого раньше, так что теперь я попытался испачкать руки, используя всякий раз, как плагин, увидев его на RailsCasts.Поэтому я пытаюсь запустить задание cron для моего приложения Ruby, но кажется, что оно не работает, возможно, из-за кода или из-за того, что я использую Windows 7?

Вот код из моей модели сервера

def self.ping
 Server.all.each do |t|
     if t.name.serverUp?
        @response = 'Up'
      else
        @response = 'Down'
     end
self.update_attribute(:serverStatus, @response.to_s)
end
end


def serverUp?
 if system 'ping '+name.to_s+' -n 1  > nul'
   @response = 'Up'
        else
  @response = 'Down'
end
  self.update_attribute(:serverStatus, @response.to_s)
@response
end

А вот код из моего файла schedule.rb с заданием cron

#every 2.minutes do
#  runner "Server.last.name = 'Works'"
#  runner "for x in Server.all.each {x.serverUp?}", environment =>"development"
#end

every 2.minutes do
  runner "Server.ping", environment =>"development"
end

Я опробовал оба метода (последний, который я использовал совсем недавно,к которому я создал метод self.ping в модели сервера.

Поэтому, когда я запускаю whenever в моем каталоге rails, я получаю следующий вывод:

PS C:\SIS> whenever
0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd C:/SIS
&& script/rails runner -e production '\''Server.ping'\'''

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.

1st)Как ни странно, среда, похоже, не перешла в разработку, хотя я и указал это в коде.2-й) Файл crontab не был обновлен (я даже не знаю, существовал ли он с самого начала?)

Поэтому я пытался создать crontab всякий раз, когда файл запускал whenever -w ping, но результаты были

PS C:\SIS> whenever -w ping
[fail] Couldn't write crontab; try running `whenever' with no options to ensure your schedule file is valid.

Так что это моя проблема, любая помощь будет признательна.

Редактировать: Хорошо, я решил использовать rufus-планировщик для обновления моего серверасписок часто.Я проверил, будет ли он работать для создания нового сервера в таблицу каждые несколько минут, и это, похоже, сработало.Однако, поскольку я не смог остановить создание серверов, я удалил его из комплекта, удалил файл 'task_scheduler', а затем переустановил и сделал все как раньше.Однако, когда я сейчас пытаюсь запустить сервер, я получаю следующую ошибку:

C:/SIS/config/initializers/task_scheduler.rb:1:in '<top (required)>': undefined method 'start_new' for Rufus::Scheduler:
Module (NoMethodError)
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:235:in 'load'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:235:in 'block in load'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:225:in 'block in load_dependency'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:596:in 'new_constants_in'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:225:in 'load_dependency'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:235:in 'load'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/engine.rb:201:in 'block (2 levels) in <class:Engine>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/engine.rb:200:in 'each'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/engine.rb:200:in 'block in <class:Engine>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/initializable.rb:25:in 'instance_exec'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/initializable.rb:25:in 'run'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/initializable.rb:50:in 'block in run_initializers'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/initializable.rb:49:in 'each'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/initializable.rb:49:in 'run_initializers'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/application.rb:134:in 'initialize!'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/application.rb:77:in 'method_missing'
        from C:/SIS/config/environment.rb:5:in '<top (required)>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:239:in 'require'

        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:239:in 'block in require'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:225:in 'block in load_dependency'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:596:in 'new_constants_in'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:225:in 'load_dependency'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/dependencies.rb:239:in 'require'

        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/application.rb:103:in 'require_environment!'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.9/lib/rails/commands.rb:22:in '<top (required)>'
        from script/rails:6:in 'require'
        from script/rails:6:in '<main>'

Код в task_scheduler выглядит следующим образом:

scheduler = Rufus::Scheduler.start_new

scheduler.every '1m' do
#     Server.all.each do
#      |server| server.name.serverUp?
#     end

     Server.ping

end

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

Редактировать Хорошо, наконец-то решил, пришлось поставить require 'rubygems' require 'rufus/scheduler' поверх моего кода.Теперь все отлично работает: -)

Ответы [ 4 ]

3 голосов
/ 15 августа 2011

Cron - это программа Unix. Он не существует в Windows.

1 голос
/ 15 августа 2011

Несмотря на то, что он далеко не так гибок, как cron, в Windows есть команда AT, которая может решить ваши проблемы, однако вы можете запланировать ее выполнение не чаще одного раза в день.Чтобы увидеть, как использовать AT, запустите AT /? в командной строке.

Для гораздо более детального управления выполняемыми задачами вы можете использовать планировщик задач Windows с графическим интерфейсом.Вы можете найти это в Панель управления -> Система и безопасность -> Администрирование -> Планировщик задач

0 голосов
/ 23 мая 2014

Да, я согласен с Jorg M, cron job - это программа unix, а также планировщик rufus для внутреннего вызова cron unix process, поэтому держитесь подальше от обоих, и вам следует использовать отложенное задание ActiveRecord , которое поможет вам сделать то же самое.

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

Удачи

0 голосов
/ 17 октября 2011

У меня была такая же проблема, вот как я ее решил:

Я создал небольшой EXE-файл в AutoIT, exe будет читать имена файлов / URL-адресов для выполнения из INI-файла (config.ini)

Я назвал EXE CRON.exe и запустил его по расписанию задач.

Файлы / URL-адреса в config.ini могут быть другими исполняемыми файлами или URL-адресами, скрипт будет работатькак запускать каждый тип.

AutoIT - очень простой язык сценариев, вы можете увидеть мой код CRON.exe ниже:

$iniFile='config.ini'

$i=0
While 1 
    $i+=1
    $file=IniRead($iniFile, 'crons', $i, 'NULL')
    If $file='NULL' Then ExitLoop

    If StringInStr($file, 'http://') Then
        InetGet($file, @TempDir, 1)
    Else
        $wd=StringSplit($file, '\', 3)
        $workingDir=''
        For $i=0 To UBound($wd)-2
            $workingDir&=$wd[$i]&'\'
        Next
        RunWait($file, $workingDir)
    EndIf
WEnd

Пример файла ini:

[CRONS]
;paths of the files to execute
1=C:\anotherEXE.exe
2=http://mySite.com/myCron.php

Все файлы выполняются в порядке без наложения, при желании вы можете изменить код AutoIT для использования Run вместо RunWait, если вы хотите выполнить все файлы одновременно.

...