2012-05-06 37 views
0

以下のコマンドはIRBで動作しますが、Rubyプログラムの内部では動作しません。 irb私のコマンドはIRBでは動作しますが、Rubyスクリプトでは動作しません。なぜですか?

DISPLAY=:5 nohup firefox youtube.com & 

それが正常に返さ:

nohup: redirecting stderr to stdout 

バッククォート( "`")の中にRubyのプログラムから呼び出された場合、それが返されます。

** (firefox:12402): WARNING **: Could not connect: Connection refused 

** (firefox:12470): CRITICAL **: unable to create '/var/www/.cache/dconf'; dconf will not work properly. 
Xlib: extension "RANDR" missing on display ":5". 
Failed to stat home directory /var/www: No such file or directory 

(firefox:12470): GConf-WARNING **: Client failed to connect to the D-BUS daemon: 
Failed to connect to socket /tmp/dbus-989cWYOeP6: Connection refused 
+1

ルビスクリプトは同じユーザーとして実行されていますか?環境変数を正しく扱うには、コマンドとして '/ usr/bin/env DISPLAY =:5 nohup ...'を必ず入れてください。 – d11wtq

+0

応答@ d11wtqをありがとう。 – Dru

+1

のコードにプレフィックスを付けると、私はパーミッションを拒否されました。したがって、IRBでコードを実行しているとき、それはrubyスクリプトが実行しているのと同じユーザーですか? – d11wtq

答えて

3

問題がでていることのように見えますXセッションに接続するためには、(Xauthorityを介して)ユーザーがその権限を持っている必要があります。 Webサーバーが実行しているwww-dataユーザーには、そのようなアクセス権はありません。

Webリクエストのコンテキスト(特に、Webブラウザを起動しているように見える)でX環境を使用しようとしている場合は、おそらくこのアプローチの考え方を再考する必要があります悪い考え方のように。

私たち(Flippa.com)は、私たちが行っていることの性質上、さまざまな理由でウェブページを開く必要があります。 phantomjsを使用します。これにはXサーバも必要ですが、 gemでXvfbと呼ばれるヘッドレスXサーバを実行します。しかし、Webリクエストのコンテキストでは、通常は高価なプロセスなので、このようなことは行いません。非同期的に実行されるバックグラウンドとオフロードでResqueワーカーの束を実行します。おそらくあなたはそのようなアプローチを考えなければならないでしょう。

また、Firefoxを起動してWebコンテンツをスクラップしたり、スクリーンショットを撮ったりする場合は、デスクトップではなくプログラマチックに使用するためのファントムを見たい場合があります。

ここでは、私たちがphantomjを使って撮影した現在のスクリーンショットの例を示します。

https://flippa.com/auctions/2703649/screenshots/30b037b026044f58764888995d41c020.png

+0

もう一度ありがとう。PhantomJSはスナップショットを撮る最初の試みでしたが、問題はフラッシュ要素をレンダリングしなかったことであり、この問題は十分に文書化されていませんでした。これらはいくつかの素晴らしいアイデアです、私はそれらを試してみましょう。 – Dru

+0

サイドノートでは、Linuxの純粋なヘッドレスなPhantomJS 1.5に移行してください。これ以上のXまたはXvfbは必要ありません。 –

+0

@AriyaHidayat、うわー、本当に?それは素晴らしいニュースです:)私たちはそれを試してみましょう。 – d11wtq

関連する問題