为什么我的命令在IRB中工作,而不是在Ruby脚本中工作?

时间:2012-05-06 03:01:23

标签: ruby bash shell irb

下面的命令在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

1 个答案:

答案 0 :(得分:3)

问题似乎是,为了连接到X会话,用户必须有权这样做(可能通过Xauthority)。运行Web服务器的www-data用户没有这样的权限。

如果您尝试在Web请求的上下文中执行X环境(特别是启动Web浏览器,就像您正在做的那样),那么您应该重新考虑一下您的方法,因为这听起来像一个坏主意。

由于我们的工作性质,我们(Flippa.com)必须出于各种原因打开网页。我们使用phantomjs,它也需要一个X服务器,尽管我们通过Xvfb gem运行一个名为Headless的无头X服务器。但是,我们不会在Web请求的上下文中执行此类操作,因为这通常是一个昂贵的过程。我们在后台运行一堆Resque工作并卸载工作异步执行。也许你应该考虑这样的方法。

此外,如果您要启动Firefox以便抓取网页内容,截取屏幕截图等,您可能需要查看phantomjs,它打算以编程方式使用,而不是在桌面上使用。

以下是我们使用phantomjs拍摄的当前屏幕截图的示例。

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