Javascriptでクローリング処理が作れてしまい、WEBサイトのjavascript実行やajax対応などもできてしまうSpookyJSが便利すぎて、Seleniumや他のスクレイピングツールと比べて非常に使い勝手が良すぎます。
ただ、このSpookyjsは、PhantomjsとCasperjsという別のモジュールを基盤に動作する仕組みの為、これらのモジュール+Nodejsがちゃんとインストールされていないと、まともに動きません。
開発環境やステージング環境では問題なく動作していたのに、本番環境で何故か動作しないという事も経験がありますが、今回はcronを実行した時のみうまく動作しない事象が発生したので、その対応策を備忘録として残しておこうと思います。
トラブルの確認
サーバーにログインしているアカウントのユーザーでcron設定していて、同じコマンドが問題なく動作するのを確認しているのに、何故かcronコマンドが実行されると、結果が取得できていない事象。
対象のアカウントでログインしてコマンドを叩いてみる。
→正常に実行される・・・
cronコマンドをセットしてみる。
→実行されず・・・
何故かうまく動作していない・・・
*/10 9-22 * * * web bash /var/www/html/crawl.sh >/dev/null 2>&1
9時〜22時の間10分感覚で特定サイトのデータを取得するというバッチですが、実行されないため不発です。
確認ポイント
cronに登録する場合、モジュールはフルパスで書くことをオススメ
sh -> /bin/sh
bash -> /bin/bash
# cron
*/10 9-22 * * * web /bin/bash /var/www/html/crawl.sh >/dev/null 2>&1
同じ理屈で、"/bin"内にしかモジュールを検索していないのではないかと思い、シンボリックリンクを設置してみる。
$ which node
/usr/local/bin/node
$ln -s /usr/local/bin/node /bin/node
$ which phantomjs
/usr/local/bin/phantomjs
$ ln -s /usr/local/bin/phantomjs /bin/phantomjs
$ which casperjs
/usr/local/bin/casperjs
$ ln -s /usr/local/bin/casperjs /bin/casperjs
これで実行してみると、cronでも今度はうまくデータ取得することができました。
spookyjs内でphantomjsとcasperjsがモジュール名で実行されているようなので、矯正的にpathを作ってあげたという解決法でした。
もっと簡単な解決方法
どうやら、上記のようにシンボリックリンクを用意するのも一つのやり方ですが、他にもいくつか方法があり、やり方だけ記述しておきます。
crontabに環境変数を設置
下記のようにcrontab内に直接環境変数を書き込んで上げることで、シンボリックリンクを作らずに対応することもできます。
※今回はこちらをやったほうが早かったかも・・・
$ vi /etc/crontab
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
全てのモジュールをフルパスで実行する
こちらはちょっと乱暴ですが、どうしてもコマンドを実行する感覚でcronや実行プログラムを構築しがちですが、環境変数を信じずに全てフルパスで構築するという手もありますね。
ただし、別サーバーなどに移した際に、モジュールパスが変わってしまうと諸刃の剣になりかねないので、オススメはできない方法です。
LINUXの共通モジュールであれば、これでいいかもしれませんが・・・
0 件のコメント:
コメントを投稿