やりたかったこと
JavaScript が使われた某サイトの情報をスクレイピングして編集し、自動で毎日Tumblr へ情報をポストしたかったのでスクリプトと実行環境を自宅の Macmini 上に作った。ruby での作業、Mac では始めてでした。
使った技術
- ruby(Capybara + Poltergeist(PhantomJS), tumblr_client)
- MySQL
- cron
引っかかったとこ
Ruby のバージョンが反映されない
問題
Capybara をインストールしようとしたときに MacOSX の ruby のバージョンが古いから、ruby のバージョンを上げてくれというメッセージが出た。
バージョンアップ方法を調べて結果、rbenv を使ってインストールしたが、反映されなかった。
解決
反映させるには
- バージョン指定して切替える
- .bash_profile に Ruby の参照パスを追加する
の2つが必要だった。そもそも rbenv はユーザー権限毎にバージョン切り替えを提供するための仕組みらしく、ユーザー毎に参照先指定するのはなるほどなーと思った。
bundler が反映されない
問題
gem は 他の言語でいうところのライブラリにあたるのかな。それらをインストールしたり管理したりするツールが複数あるらしく(めんどい)、というか複数あるなんてしらず、たまたま見ていた記事では bundler というツールで gem をインストールすると書いてあったので、そのまま適応してみたんですよね。でインストールしたけど、そんなコマンド知らん、といって怒られた。
解決
bundler へのパス通す必要がある。というかインストール時にうまいことやって欲しいぜ。。
.bashrc にパスを追加することで解決。
gem が反映されない
問題
bundler でインストールした gem ないって怒られた。
解決
bundler でインストールした gem を使う(require)にはプログラム内に
require 'bundler/setup'
Bundler.require
と書く必要がある。
bundler も rbenv 同様にユーザー毎に設定する感じなんですね。
ruby スクリプトが cron で起動できない
問題
ユーザー環境で問題なく tumblr_client による投稿も確認できたので、cron で自動投稿しようとしたら、ruby のバージョンが違う、といわれて怒られた。
解決
ユーザー環境では当然、rbenv で参照する .bash_profile を読み込んでいるけれど、cron を動かす root さんはユーザー環境なんか知らんので、既存の ruby を呼び出してしまい、結果システムが使う古い ruby が起動してしまっていた。なので、起動する際に、ユーザーの .bash_profile を読み込んでからスクリプトを起動するように cron のコマンドを書き換える。
* * * * * sonots /bin/bash -lc 'cd /path/to/program-dir && ruby program.rb'
/bin/bash を使うのですけど cron のデフォルトは /bin/sh だったので、crontab に「SHELL=/bin/bash」を追加しました。
bash のオプション -l はログインシェルとして起動されたかのように動くので、.bash_profile を読み込む、-c で以降のスクリプトを起動する、といった意味ですね。
参考リンク
rbenv
rbenvとは?(rbenvを利用したRubyのインストール)
rbenvでmacのrubyを最新にする
Rubyのバージョンが切り替わらない時の対処法!
bundler
cron
- cronでrbenvのrubyを使う3つの方法 3番目のやつ