毎日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

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

コメントを残す

メールアドレスが公開されることはありません。