1

以下のコマンドは IRB で機能しますが、Ruby プログラム内からは機能しません。

DISPLAY=:5 nohup firefox youtube.com &  

その中irbで、次のものが正常に返されます。

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
4

1 に答える 1

3

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

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

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

また、Web コンテンツをスクレイピングしたり、スクリーンショットを撮ったりするために Firefox を起動している場合は、デスクトップではなくプログラムで使用することを目的とした phantomjs を確認することをお勧めします。

これは、phantomjs を使用して取得した現在のスクリーンショットの例です。

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

于 2012-05-06T09:35:30.310 に答える