我遇到一个问题,当访问 URL 时,带有 Capybara 和 capybara-webkit 的 webkit_server 实例运行无头连接到本地 Xvfb 屏幕时挂起。它似乎是在反复访问不同的 URL 并执行查找程序几分钟后发生的。(我将 capybara 用于香草 Ruby 中的屏幕抓取应用程序,而不是用于测试。)
我已经确认,当它挂起时,仍然可以访问该站点(例如,通过命令行上的 curl 或 wget)。我还尝试将调用访问和后续查找器的 Ruby 代码包装在 Timeout 块中,以便在等待 60 秒后访问新 URL,但在第一次发生这种情况后,任何 visit() 尝试都会失败。解决此问题的唯一方法是杀死调用 Capybara/capybara-webkit 的 Ruby 进程和 webkit_server 进程并重新启动。
当我跟踪 webkit_server 进程时,我反复看到这样的输出:
clock_gettime(CLOCK_MONOTONIC, {5821, 680279627}) = 0
gettimeofday({1330890176, 712033}, {0, 33052112}) = 0
gettimeofday({1330890176, 712087}, {0, 140736435864256}) = 0
gettimeofday({1330890176, 712137}, {0, 33108640}) = 0
clock_gettime(CLOCK_MONOTONIC, {5821, 680486036}) = 0
clock_gettime(CLOCK_MONOTONIC, {5821, 680530091}) = 0
read(7, 0x1fac1b4, 4096) = -1 EAGAIN (Resource temporarily unavailable)
如果我 strace 调用它的 Ruby 进程,它会挂在 read() 上:
Process 3331 attached - interrupt to quit
read(5,
^C <unfinished ...>
Process 3331 detached
我知道 Ruby 代码挂在 Capybara visit() 方法上。
任何关于我可以做些什么来解决或纠正这个问题的想法都值得赞赏。我假设问题与 webkit_server 需要访问 URL 的某些资源有关,但不确定接下来要尝试什么。
谢谢!