毎日cronで日記にtwitterでのつぶやきを収集して投稿するスクリプトを実行しています。cronから実行しているのはシェルスクリプトで、その中からrubyスクリプトを呼んでいます。

/etc/cron.d/twitter2diary)
10ebi/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':Couldnotfindtwitter>=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|greptwitter
twitter-2.0.2/
twitter-3.1.1/
twitter-3.2.0/
twitter-3.3.1/

では、普通に実行するとこれが使われているという事なのだろう。rubyのバージョンは?

$ruby
ruby1.9.3p194(2012-04-20revision35410)[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”」でググってみる。

ここによるとやっぱりruby1.8とruby1.9が共存している環境では/var/lib/gems/1.8と/var/lib/gems/1.9が両方存在しているようだ。よくわからないけど以下のコマンドを打ってみる

geminstallrubygems-update
var/lib/gems/1.8/bin/update_rubygems
RubyGems1.8.24installed

に加えて

RubyGemsinstalledthefollowingexecutables:/usr/bin/gem1.9.1

なんてのも表示された。

gem1.9.1installrubygems-update

としてみる。

Successfullyinstalledrubygems-update-1.8.24
1geminstalled
Installingridocumentationforrubygems-update-1.8.24...
InstallingRDocdocumentationforrubygems-update-1.8.24...

となった。gem1.9.1を実行しているのにrubygems-update-1.8.24がインストールされるって、これは正しいのだろうか?

この段階で/var/lib/gems/1.9.1は存在しないこの段階ですでに何かおかしいのかな。

よくわからないけどこの段階でgem1.9.1ってコマンドがあるのなら……思って以下のコマンドを打ってみた

gem1.9.1installtwitter

するとなにやらインストールされた。

Fetching:twitter-3.4.0.gem(100%)
Successfullyinstalledtwitter-3.4.0
1geminstalled
Installingridocumentationfortwitter-3.4.0...
InstallingRDocdocumentationfortwitter-3.4.0

でも、/var/lib/gems/1.9.1はできてない……。

echo$GEM_HOME
var/lib/gems/1.8/

むむ。これが原因なのか?これはどこで設定されてるんだ。

調べたら~/.bash_profileで設定されてた。これは自分で書いたのか?とりあえず消してみる。

gem1.9.3なんてのがあるのにも気がついたので

gem1.9.3installtwitter
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%)
Successfullyinstalledmultipart-post-1.1.5
Successfullyinstalledfaraday-0.8.1
Successfullyinstalledmulti_json-1.3.6
Successfullyinstalledsimple_oauth-0.1.9
Successfullyinstalledtwitter-3.4.0
5gemsinstalled
Installingridocumentationformultipart-post-1.1.5...
Installingridocumentationforfaraday-0.8.1...
Installingridocumentationformulti_json-1.3.6...
Installingridocumentationforsimple_oauth-0.1.9...
Installingridocumentationfortwitter-3.4.0...
InstallingRDocdocumentationformultipart-post-1.1.5...
InstallingRDocdocumentationforfaraday-0.8.1...
InstallingRDocdocumentationformulti_json-1.3.6...
InstallingRDocdocumentationforsimple_oauth-0.1.9...
InstallingRDocdocumentationfortwitter-3.4.0

なにやらうまく行ってる予感。でも、/var/lib/gems/1.9.3なんてのはできてない。

$gem1.9.3whichtwitter
/usr/lib/ruby/1.9.1/twitter.rb

おや、そんなところにインストールされたんですか。

$gem1.8whichtwitter
var/lib/gems/1.8/gems/twitter-3.4.0/lib/twitter.rb

ってことで別の場所に入ってるのでこれでいいのかもしれない。これで様子をみてみよう……。