PhantomJS 进程在调用 program.kill() 后将 运行 保留在后台

PhantomJS process keeps running in background after calling program.kill()

我正在使用 phantomjs 和 webdriverio 来获取和呈现由 javascript 加载的网页,然后将其保存以供稍后由 cheerio 解析。 这是相关代码:

import phantomjs from 'phantomjs-prebuilt'
const webdriverio = require('webdriverio')

const wdOpts = {
  desiredCapabilities: {
    browserName: 'phantomjs'
  }
}

async parse (parseUrl) {
  return phantomjs.run('--webdriver=4444').then(program => {
    return webdriverio.remote(wdOpts)
      .init()
      .url(parseUrl)
      .waitForExist('.main-ios', 100000)
      .pause(5000)
      .getHTML('html', true)
      .then((html) => {
        program.kill()
        return html
      })
  })
}

即使我调用 program.kill(),我也注意到进程列表中的 phantomjs,它确实占用了大量 RAM 和 CPU。

我想知道为什么进程没有终止。

PhantomJS 是一个包含 2 个组件的产品。 Javascript 作为代码的一部分在客户端(无论是 Web 还是其他脚本)端运行。然后是作为 server-side 应用程序运行的部分(命令行调用)

根据我使用 PhantomJS 的经验,当遇到错误时,PHantomJS 服务器端 "hangs" 但没有响应。如果您可以更新对此脚本的调用以提供输出日志记录,您可能能够看到 PhantomJS 应用程序遇到的错误。

phantomjs /path/to/script/ > /path/to/log/file 2>&1

希望对您有所帮助!如果您希望我澄清或详细说明任何内容,我很乐意更新我的答案,请在评论中告诉我,谢谢!

.close() 只是关闭 window。有一个已知错误,如果它是最后一个 window 它会保持打开状态。

.quit() 应该这样做,但也有与之相关的问题。

PhantomJS 错误报告:https://github.com/detro/ghostdriver/issues/162

有人在该主题的底部发布了一个不错的解决方法: https://github.com/SeleniumHQ/selenium/issues/767#issuecomment-140367536 此修复程序发出一个 SIGTERM 来结束它:(在 python 中,但可能有用)

# assume browser = webdriver.PhantomJS()
browser.service.process.send_signal(signal.SIGTERM)
browser.quit()

我喜欢用我的自动化打开一个 Docker 容器,然后 运行 把它放在那里。 Docker 为我关闭它,但这超出了你想做的范围。我会推荐上面的 SIGTERM+quit 方法。