【问题标题】:Why does my command work in IRB but not from a Ruby script?为什么我的命令在 IRB 中有效,但在 Ruby 脚本中无效?
【发布时间】:2012-05-06 03:01:23
【问题描述】:

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

【问题讨论】:

  • ruby 脚本是否以同一用户身份运行?确保将/usr/bin/env DISPLAY=:5 nohup ... 作为您的命令,以便正确处理环境变量。
  • 感谢@d11wtq 的回复。当我使用上面的代码前缀时,我收到了权限被拒绝的消息
  • 那么当您在 IRB 中运行代码时,是否与运行 ruby​​ 脚本的用户相同?
  • 是的,权限完全不同。 www-data 用户无权连接到 X 会话,或配置了 .Xauthority 文件。你能解释一下你想要达到的目标吗,然后我们可能会想出一个解决方法。通过 Web 请求连接到 Xserver 似乎有点不稳定,并且应该在后台任务中发生。
  • 完成。我也给了你一些想法。我们使用不同的工具为您提供不同的方法。

标签: ruby bash shell irb


【解决方案1】:

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

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

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

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

这是我们使用 phantomjs 截取的当前屏幕截图示例。

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

【讨论】:

  • 再次感谢。 PhantomJS 是我第一次尝试拍摄快照,问题是它没有渲染 Flash 元素,而且这个问题没有得到很好的记录。这些是一些很棒的想法,我会尝试一下。
  • 在旁注中,转移到在 Linux 上纯无头的 PhantomJS 1.5。不再需要 X 或 Xvfb。
  • @AriyaHidayat,哇,真的吗?这是个好消息 :) 我们会尝试一下。
  • 订阅邮件列表,随时获取最新和未来的更新!
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2014-08-02
  • 1970-01-01
  • 2021-11-13
  • 2017-03-26
  • 2013-02-07
相关资源
最近更新 更多