rails 独学して軽くにちゃんまとめつくる

読者です 読者をやめる 読者になる 読者になる

windows環境で clockwork を使って定期的に ruby ファイルを実行する

cron というのもある clockwork というのを使ったら定期的に ruby データを収集したり、記事を更新したりできるので便利だ。その使いかたをかく。

なにはともあれまずrubyコマンドラインで実行できるコードを書いて動くことを確認する。一番簡単なのがログを残すことだろう。

まずclockwork の gem をインストールするために gem install clockwork と入力する。つぎに clockwork.rb というファイルを作成し、以下のコードを入力する。

Clockwork.configure do |config|
  config[:logger] = Logger.new("clockwork.log")
  config[:tz] = 'UTC'
end

module Clockwork
  handler do |job|
      log = Logger.new("clockwork.log")
      log.debug("#{job}がちゃんと読み込めてますおっと")
  end
  every(1.seconds, '1秒ごとのジョブ')
  every(2.seconds, '2秒ごとのジョブ')
end


そして実行するために clockwork clockwork.rbコマンドラインに入力して実行すると、 clockwork.log というファイルが新しくできて、その中をみると以下のように表示される。

# Logfile created on 2017-03-18 03:47:56 +0000 by logger.rb/53141
I, [2017-03-18T03:47:56.709279 #7712]  INFO -- : Starting clock for 2 events: [ 1秒ごとのジョブ 2秒ごとのジョブ ]
I, [2017-03-18T03:47:56.749569 #7712]  INFO -- : Triggering '1秒ごとのジョブ'
D, [2017-03-18T03:47:56.749785 #7712] DEBUG -- : 1秒ごとのジョブがちゃんと読み込めてますおっと
I, [2017-03-18T03:47:56.749843 #7712]  INFO -- : Triggering '2秒ごとのジョブ'
D, [2017-03-18T03:47:56.749965 #7712] DEBUG -- : 2秒ごとのジョブがちゃんと読み込めてますおっと
I, [2017-03-18T03:47:57.001589 #7712]  INFO -- : Triggering '1秒ごとのジョブ'
D, [2017-03-18T03:47:57.001862 #7712] DEBUG -- : 1秒ごとのジョブがちゃんと読み込めてますおっと
I, [2017-03-18T03:47:58.001508 #7712]  INFO -- : Triggering '1秒ごとのジョブ'
D, [2017-03-18T03:47:58.001769 #7712] DEBUG -- : 1秒ごとのジョブがちゃんと読み込めてますおっと
I, [2017-03-18T03:47:58.001902 #7712]  INFO -- : Triggering '2秒ごとのジョブ'
D, [2017-03-18T03:47:58.002082 #7712] DEBUG -- : 2秒ごとのジョブがちゃんと読み込めてますおっと

とりあえず動くことがわかった。handler do ~ end に囲まれた場所に定期的に実行したい処理の内容を書くのだが、長くなったら読みにくいので、別ファイルに定義してあるメソッドも実行できることを確かめてみる。

気をつけるポイントは、require で外部ファイルを読み込む方法だけだろうか。同じディレクトリにいるファイルを読み込むときは require './yobitaifail.rb' というように require の後ろに ./をつけてから読み込みたいファイル名を書く。こうしたらほかのファイルのメソッドを使うことができるので覚えておこう。

さっきとよく似ているが、 require というのを付け足したのと、handler do ~ end の中に処理をかくのではなく、 clockwork_log.rb 内のメソッドであるlog_start を定義してある。

require './clockwork_log.rb'

Clockwork.configure do |config|
  config[:logger] = Logger.new("clockwork.log")
  config[:tz] = 'UTC'
end

module Clockwork
  handler do |job|
      log_start
  end
  every(1.seconds, '別メソッド')
end

別に用意したメソッドを入れるファイルを作る。clockwork_log.rbと名付けておく。さっき使った log_start というメソッドを定義しておく。

def log_start
  log = Logger.new("clockwork.log")
  log.debug("ちゃんと読み込めてますおっと")
end

はたしてうまくいっているのだろうか。実行してみて作成されているはずのclockwork.log というファイルを開いて除いてみると

# Logfile created on 2017-03-18 04:01:22 +0000 by logger.rb/53141
I, [2017-03-18T04:01:22.799913 #7869]  INFO -- : Starting clock for 1 events: [ 別メソッド ]
I, [2017-03-18T04:01:22.837993 #7869]  INFO -- : Triggering '別メソッド'
D, [2017-03-18T04:01:22.838198 #7869] DEBUG -- : ちゃんと読み込めてますおっと
I, [2017-03-18T04:01:23.001448 #7869]  INFO -- : Triggering '別メソッド'
D, [2017-03-18T04:01:23.001684 #7869] DEBUG -- : ちゃんと読み込めてますおっと
I, [2017-03-18T04:01:24.001515 #7869]  INFO -- : Triggering '別メソッド'
D, [2017-03-18T04:01:24.001847 #7869] DEBUG -- : ちゃんと読み込めてますおっと
I, [2017-03-18T04:01:25.001597 #7869]  INFO -- : Triggering '別メソッド'
D, [2017-03-18T04:01:25.001996 #7869] DEBUG -- : ちゃんと読み込めてますおっと
I, [2017-03-18T04:01:26.001540 #7869]  INFO -- : Triggering '別メソッド'

うむ、ちゃんと動いていることがわかった。

つぎに rails と組み合わせて実行する。 とりあえず簡単な log を保存してみる。 場所 config/clockwork.rb にしてみて bundle exec clockwork config/clockwork.rb と入力して実行する

次に外部ファイルを読み込んでみる require './target.rb' というのを先ほどのファイルにかきこむ。

^Cmoorii:~/workspace/AutoComplete $ bundle exec clockwork conf/clockwork.rb
/home/ubuntu/workspace/AutoComplete/config/clockwork.rb:3:in
 `require': cannot load such file -- ./target.rb (LoadError)
from /home/ubuntu/workspace/AutoComplete/config/clockwork.rb:3:in `<top (required)>'

エラーがでた。 require じゃだめらしい。どうやら require_relative というのを使えばいいらしい。 先ほどの require './target.rb'require_relative 'target' に変えれば大丈夫。

clockwork.rb

require 'clockwork'
require 'logger'
require_relative 'target'

Clockwork.configure do |config|
  config[:logger] = Logger.new("clockwork.log")
  config[:tz] = 'UTC'
end

module Clockwork
  handler do |job|
    log_start   
  end

  every(3.seconds, 'every_minute')
end

target.rb

def log_start
    log = Logger.new("clockwork.log")
    log.debug("ああああ")    
end

すると clockwork.log

I, [2017-03-18T04:53:04.238448 #8878]  INFO -- : Triggering 'every_minute'
D, [2017-03-18T04:53:04.238635 #8878] DEBUG -- : ああああ
I, [2017-03-18T04:53:07.001501 #8878]  INFO -- : Triggering 'every_minute'
D, [2017-03-18T04:53:07.001764 #8878] DEBUG -- : ああああ
D, [2017-03-18T04:53:08.263038 #8878] DEBUG -- : Got INT signal
I, [2017-03-18T04:53:08.263256 #8878]  INFO -- : Shutting down

というファイルができる。clockwork.log ファイルは一番上の層にできる。

これで clockwork をつかって ruby ファイルを実行させることがわかった。