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 方法。
我正在使用 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 方法。