2012-07-24
毎日cronで日記にtwitterでのつぶやきを収集して投稿するスクリプトを実行しています。cronから実行しているのはシェルスクリプトで、その中からrubyスクリプトを呼んでいます。
(/etc/cron.d/twitter2diary)
1 0 * * * ebi /home/ebi/twitter2tdiary/twitter2tdiary.sh
(/home/ebi/twitter2tdiary/twitter2tdiary.sh)
#!/bin/sh
cd /home/ebi/twitter2tdiary
ruby /home/ebi/twitter2tdiary/twitter2tdiary.rb
以前はこれできちんと動いていたのですが、apt-get upgradeでwheezyにしてからきちんと動かなくなってしまいました。直接の原因は内部で使用していたtwitter gemで、これの最新版をgem install twitterでインストールし、最新版のgemで動くようにスクリプトを修正することで、普通にシェルからtwitter2tdiary.shを呼べば正常に動作するようになりました。
でも、それでもcronから実行すると失敗してしまいます。
/usr/lib/ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find twitter (>= 0) amongst [] (Gem::LoadError)
from /usr/lib/ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
from /usr/lib/ruby/1.9.1/rubygems.rb:1231:in `gem'
from /home/ebi/twitter2tdiary/twitter2tdiary.rb:4:in `'
きっと環境変数とかその辺りがおかしいんだろうと思いつつ、そもそも仕組みがわかっていないのでその辺を確認してみたい。
とりあえずdebianでは/var/lib/gems以下にgemが置かれるらしい。確かにあった。
/var/lib/gems/1.8/gems$ ls | grep twitter
twitter-2.0.2/
twitter-3.1.1/
twitter-3.2.0/
twitter-3.3.1/
では、普通に実行するとこれが使われているという事なのだろう。rubyのバージョンは?
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
1.9。upgradeまえは1.8だったはずで、ruby1.8だから/var/lib/gems/1.8を使う…という訳じゃないのだろうか?「”/var/lib/gems/1.8” “/var/lib/gems/1.9”」でググってみる。
- Linux で Ruby のインストール http://www.kkaneko.com/rinkou/ruby/rubyinstalllinux.html
ここによるとやっぱりruby1.8とruby1.9が共存している環境では/var/lib/gems/1.8と/var/lib/gems/1.9が両方存在しているようだ。よくわからないけど以下のコマンドを打ってみる
gem install rubygems-update
/var/lib/gems/1.8/bin/update_rubygems
RubyGems 1.8.24 installed
に加えて
RubyGems installed the following executables: /usr/bin/gem1.9.1
なんてのも表示された。
gem1.9.1 install rubygems-update
としてみる。
Successfully installed rubygems-update-1.8.24
1 gem installed
Installing ri documentation for rubygems-update-1.8.24...
Installing RDoc documentation for rubygems-update-1.8.24...
となった。gem1.9.1を実行しているのにrubygems-update-1.8.24がインストールされるって、これは正しいのだろうか?
この段階で/var/lib/gems/1.9.1は存在しないこの段階ですでに何かおかしいのかな。
よくわからないけどこの段階でgem1.9.1ってコマンドがあるのなら……思って以下のコマンドを打ってみた
gem1.9.1 install twitter
するとなにやらインストールされた。
Fetching: twitter-3.4.0.gem (100%)
Successfully installed twitter-3.4.0
1 gem installed
Installing ri documentation for twitter-3.4.0...
Installing RDoc documentation for twitter-3.4.0…
でも、/var/lib/gems/1.9.1はできてない……。
echo $GEM_HOME
/var/lib/gems/1.8/
むむ。これが原因なのか?これはどこで設定されてるんだ。
調べたら~/.bash_profileで設定されてた。これは自分で書いたのか?とりあえず消してみる。
gem1.9.3なんてのがあるのにも気がついたので
gem1.9.3 install twitter
Fetching: multipart-post-1.1.5.gem (100%)
Fetching: faraday-0.8.1.gem (100%)
Fetching: multi_json-1.3.6.gem (100%)
Fetching: simple_oauth-0.1.9.gem (100%)
Fetching: twitter-3.4.0.gem (100%)
Successfully installed multipart-post-1.1.5
Successfully installed faraday-0.8.1
Successfully installed multi_json-1.3.6
Successfully installed simple_oauth-0.1.9
Successfully installed twitter-3.4.0
5 gems installed
Installing ri documentation for multipart-post-1.1.5...
Installing ri documentation for faraday-0.8.1...
Installing ri documentation for multi_json-1.3.6...
Installing ri documentation for simple_oauth-0.1.9...
Installing ri documentation for twitter-3.4.0...
Installing RDoc documentation for multipart-post-1.1.5...
Installing RDoc documentation for faraday-0.8.1...
Installing RDoc documentation for multi_json-1.3.6...
Installing RDoc documentation for simple_oauth-0.1.9...
Installing RDoc documentation for twitter-3.4.0…
なにやらうまく行ってる予感。でも、/var/lib/gems/1.9.3なんてのはできてない。
$gem1.9.3 which twitter
/usr/lib/ruby/1.9.1/twitter.rb
おや、そんなところにインストールされたんですか。
$gem1.8 which twitter
/var/lib/gems/1.8/gems/twitter-3.4.0/lib/twitter.rb
ってことで別の場所に入ってるのでこれでいいのかもしれない。これで様子をみてみよう……。