我有两个应用程序运行在一个服务器上,执行无头浏览任务每次浏览时,xvfb进程都不会消亡,而是变成一个僵尸。我可以用下面的脚本来确认这一点。

require 'headless'
require 'watir-webdriver'
require 'yaml'

zombies_at_start = `ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'`.split("\n").count

5.times do
  begin
    d = YAML.load_file("/path/to/config/headless.yml")['build_number'] #=> "98"
    h = Headless.new(:display => d)
    h.start
    b = Watir::Browser.new :firefox
    b.goto 'http://google.com'
    sleep(0.5)
  ensure
    b.close
    h.destroy
  end
  sleep(0.5)
end

zombies_at_end = `ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'`.split("\n").count

puts "Created #{zombies_at_end - zombies_at_start} more zombies."
#=> Created 5 more zombies.

为什么?我该怎么解决?
版本信息:
xorg-x11-server-Xvfb-1.15.0-26.el6.centos.i686
CentOS 6.5版(最终版)
红宝石-2.0.0-p353
裂谷值1.25.25
Selenium网络驱动程序(2.45.0、2.44.0)
watir网络驱动程序(0.7.0)
无头(2.1.0)

最佳答案

更新:默认接受提交给headless等待的apull request。求爱!
宝石无头changed the way it starts, stops (kills) and verifies the Xvfb process虽然我不完全确定为什么,但在CentOS 6上这会导致进程僵尸化因为.destroy之前没有引起问题,所以它必须与headless启动xvfb进程(同时重新编写)的方式有关。
然而,gem同时引入了.destroy_sync,它等待进程死亡,并且不会创建僵尸。

require 'headless'
require 'watir-webdriver'
require 'yaml'

zombies_at_start = `ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'`.split("\n").count

5.times do
  begin
    d = YAML.load_file("/path/to/config/headless.yml")['build_number'] #=> "98"
    h = Headless.new(:display => d)
    h.start
    b = Watir::Browser.new :firefox
    b.goto 'http://google.com'
    sleep(0.5)
  ensure
    b.close
    # h.destroy
    h.destroy_sync
  end
  sleep(0.5)
end

zombies_at_end = `ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'`.split("\n").count

puts "Created #{zombies_at_end - zombies_at_start} more zombies."
#=> Created 0 more zombies.

关于ruby - Ruby headless (headless)watir-webdriver Xvfb僵尸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30754358/

10-13 04:43