1

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もので、サーバーモデルでメソッドを作成しました。

したがって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.

1)おかしなことに、コードで述べても環境は開発に変わっていないようです。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-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

2つの方法のどちらを使用するかわからないため、最初の方法をコメントアウトしました。助けていただければ幸いです。前もって感謝します

編集 OK、最終的にそれを解決し、require 'rubygems' require 'rufus/scheduler'私のコードの上に置く必要がありました。今では正常に動作します:-)

4

4 に答える 4

3

Cron は Unix プログラムです。Windows には存在しません。

于 2011-08-15T11:43:07.633 に答える
1

cron ほど柔軟ではありませんが、Windows にはAT問題を解決できる可能性のあるコマンドがありますが、1 日に 1 回しか実行するようにスケジュールすることはできません。コマンドラインでAT実行する方法を確認するには。AT /?

実行中のタスクをよりきめ細かく制御するには、GUI ベースの Windows タスク スケジューラを使用できます。これは、[コントロール パネル] -> [システムとセキュリティ] -> [管理ツール] -> [タスク スケジューラ] にあります。

于 2011-08-15T12:30:59.853 に答える
0

私は同じ問題を抱えていました、これが私がそれを解決した方法です:

AutoIT で小さな EXE を作成しました。exe は、ini ファイル (config.ini) から実行するファイル/URL の名前を読み取ります。

EXE に CRON.exe という名前を付け、スケジュールされたタスクを介して起動させました。

config.ini 内のファイル/URL は、他の実行可能ファイルまたは 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

すべてのファイルはオーバーラップなしで順番に実行されます。すべてのファイルを同時に実行する場合は、Run代わりに使用する AutoIT コードをオプションで変更できます。RunWait

于 2011-10-17T15:16:16.387 に答える
0

はい、Jorg M に同意します。cron ジョブは unix プログラムであり、rufus スケジューラも cron unix プロセスを内部的に呼び出すため、両方から離れて、同じことを行うのに役立つ遅延ジョブ ActiveRecordを使用する必要があります。

これは私の経験によるもので、他の方法もあるかもしれませんが、これは私が今まで使った中で最高です.

幸運

于 2014-05-23T11:28:59.670 に答える