Help us understand the problem. What is going on with this article?

godでtwitter gemのstreamingを常時監視するのに苦労した時のメモ

More than 3 years have passed since last update.

Twitter監視するスクリプト作ったぞー

そんな時に神に降臨してほしい。
godのスタートアップをやってみた - mosson | Qiita

うまく動いてくれない

なんだかgodの設定例に従うとうまく動いてくれるのに、いざ自分のrubyスクリプトを神様に監視していただこうと思ってもうまくいかない。

streamtest.rb
require 'twitter'
#...
# 認証とか済ませてから
#...
stream = account.stream_api  # Twitter::Streaming::Clientオブジェクト
stream.user do |object|
  if obj == Twitter::Tweet
    p "ツイートを取得しました"
  end
end
streamtest.god
FILE_PATH = "#{Dir.pwd}/streamtest.rb" # あなたの常駐化させたいアプリ
God.watch do |w|
  w.name = "streamtest"
  w.start = "ruby #{Dir.pwd}.rb"
  w.keepalive
end

これで god -c ./streamtest.god -D しても

Shell
I [2016-01-25 04:11:58]  INFO: streamtest [trigger] process is not running (ProcessRunning)
I [2016-01-25 04:11:58]  INFO: streamtest move 'up' to 'start'
I [2016-01-25 04:11:58]  INFO: streamtest start: ruby /home/me/streamtest.rb
I [2016-01-25 04:11:58]  INFO: streamtest moved 'up' to 'up'
I [2016-01-25 04:12:03]  INFO: streamtest [trigger] process is not running (ProcessRunning)
I [2016-01-25 04:12:03]  INFO: streamtest move 'up' to 'start'
I [2016-01-25 04:12:03]  INFO: streamtest start: ruby /home/me/streamtest.rb
I [2016-01-25 04:12:03]  INFO: streamtest moved 'up' to 'up'
I [2016-01-25 04:12:08]  INFO: streamtest [trigger] process is not running (ProcessRunning)
I [2016-01-25 04:12:08]  INFO: streamtest move 'up' to 'start'
I [2016-01-25 04:12:08]  INFO: streamtest start: ruby /home/me/streamtest.rb
...

って感じで永遠に起動してくれない。
30分くらい触った結果、loop do ... end 以外のループ文(というかブロック文)とgodの相性が悪いのではないかと思った。
File.open do ... end とか Twitter::Streaming::Client.user do ... end があるとgodでは起動してくれない(のかすぐ終了してしまうかどちらか)っぽい。

改善策

  • それ自体がループしてなさそうで
  • streamtest.rbが死んだ時に終了してくれる
    そんなプログラムを間に挟めばいいのではないだろうか

=> foremanがあるじゃないかー
foreman で アプリケーションを動かす。- 7kaji | Qiita

というわけで、

まずProcfilestreamtest.rbと同じフォルダに。

Procfile
web: ruby ./streamtest.rb 

なににするか迷ったけどとりあえずwebに。

そしてstreamtest.godも書き換え。

streamtest.god(新)
God.watch do |w|
  w.name = "streamtest"
  w.start = "foreman start -d #{Dir.pwd}"
  w.keepalive
end

-dオプションでProcfileのロケーションを渡します。
#{Dir.pwd} としてるところはちゃんと絶対パスを指定したほうがいいです。本当は。これはまだ作りかけでファイルの位置がコロコロ変わるのでパスを取得するようにしています。

結果

動いた! ばんざい!
5秒毎に [trigger] process is not running (ProcessRunning) と出ることがなくなりました。
 
 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away