在Windows中运行cron时

时间:2011-08-15 10:35:25

标签: ruby-on-rails ruby ruby-on-rails-3 whenever rufus-scheduler

cronjobs的新手和那种有点东西,从来没有做过,所以现在我尝试在RailsCasts上看到它后,无论何时作为插件使用我的手。 所以我试图为我的Ruby应用程序运行一个cron作业,但看起来它不起作用,也许是因为代码或者因为我使用的是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方法。

所以当我在rails目录中运行whenever时,这是我得到的输出:

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.
第1页)有趣的是,即使我在代码中说明了环境,环境似乎也没有改变。 2)crontab文件没有更新(我甚至不知道是否有一个开始?)

所以我尝试通过运行whenever -w ping来创建一个crontab文件,但结果是

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-scheduler来频繁更新我的服务器列表。我测试了每一分钟是否可以在表中创建一个新的服务器,这似乎有效。 但是,因为我无法阻止它创建服务器,所以我将其从捆绑包中删除,删除了'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 个答案:

答案 0 :(得分:3)

Cron是一个Unix程序。它在Windows上不存在。

答案 1 :(得分:1)

尽管它没有cron那么灵活,但是Windows有AT命令可以解决你的问题,但是你只能安排它每天最多运行一次。要了解如何在命令行中使用AT运行AT /?

对于运行任务的更精细控制,您可以使用基于GUI的Windows任务调度程序。你可以在控制面板 - &gt;中找到它。系统和安全 - &gt;管理工具 - &gt;任务计划程序

答案 2 :(得分:0)

我有同样的问题,这就是我解决它的方法:

我在AutoIT中创建了一个小EXE,exe将读取要从ini文件执行的文件/ url的名称(config.ini)

我命名了EXE CRON.exe,并通过schedulled tasks启动它。

config.ini中的文件/网址可以是其他可执行文件或网址,脚本将确定如何运行每种类型。

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

答案 3 :(得分:0)

是的我同意Jorg M,cron job是unix程序,rufus调度程序内部调用cron unix进程,所以远离两者,你应该使用delayed job ActiveRecord来帮助你做同样的事情。

根据我的经验,可以采取其他方式,但这是我用过的最好的方式。

祝你好运