【问题标题】:RSelenium: server signals port is already in useRSelenium:服务器信号端口已在使用中
【发布时间】:2017-10-14 22:44:08
【问题描述】:

我在 RSelenium 中使用以下代码打开浏览器。在我关闭浏览器,甚至通过运行 remDr$close() 关闭处理程序后,该端口仍在使用中。我必须去终端并手动终止进程,以便相同的端口可用。是否有任何自动化方式可以让 RSelenium 在完成抓取后释放端口?

这是我的代码:

library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()

谢谢

【问题讨论】:

    标签: r rselenium


    【解决方案1】:

    该进程由服务器(Selenium Server)和客户端两部分组成 (您启动的浏览器)。 remoteDriver 类的close 方法关闭客户端(浏览器)。完成后还需要停止服务器。

    完成后停止服务器:

    library(RSelenium)
    rD <- rsDriver(verbose = FALSE,port=4444L)
    remDr <- rD$client
    remDr$close()
    

    现在要么显式停止服务器:

    rD$server$stop()
    

    或者如果rD 对象被删除,服务器将在垃圾收集时停止:

    library(RSelenium)
    rD <- rsDriver(verbose = FALSE,port=4444L)
    remDr <- rD$client
    remDr$close()
    rm(rD)
    gc()
    

    【讨论】:

    • 你好。尝试了这两个交流几次,不行。浏览器关闭,但是当我尝试重新启动 rD 对象时,我总是收到端口 4567 已在使用中的错误。只有完全退出 R 会话才会释放它。
    • 我和@GuyManova 有同样的问题。
    • 所以在这里加上我的 2 美分。似乎该解决方案不适用于更新的 Rselenium 包。使用下面@Seb_ISU 推荐的解决方案,在这里的线程上找到:github.com/ropensci/RSelenium/issues/228
    【解决方案2】:

    对我有用的是根本不叫停止,只叫关闭。

    rD <- rsDriver(port = 4444L)
    remDr <- rD[["client"]]
    remDr$close()
    rm(rD)
    gc()
    

    编辑:没关系 - 这在上周工作了几次,然后又没有工作了。

    【讨论】:

      【解决方案3】:

      直到最近我才遇到问题。对我有用的是使用上面的解决方案并按照thread 中的解决方案添加一行来杀死 RStudio 中的 Java 实例。

      remDr$close()
      rD$server$stop()
      rm(rD, remDr)
      gc()
      
      system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)
      

      【讨论】:

      • 非常感谢。几个月来一直在处理这个烦人的问题。
      【解决方案4】:

      命令:

      system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)
      

      将释放所有端口。

      如果你想释放一个特定的端口,你可以这样做:

      #获取你启动的进程的PID

      pid <- driver$server$process$get_pid()
      

      #在下面的命令中粘贴这个PID(也会杀死所有的子进程,也会关闭浏览器)

      system(paste0("Taskkill /F /T" ," /PID ", pid))
      

      【讨论】:

      • 虽然我希望有针对性地杀死,但上述内容并不针对孤立的 Java 进程——它对我不起作用。
      • 你想杀死一个特定的子进程吗?
      【解决方案5】:

      避免此问题的一种方法是使用free_port() 查找空闲端口(而不是手动指定)

      library(netstat)
      rsDriver(verbose = FALSE, port=free_port())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-12
        • 2016-03-19
        • 2013-08-05
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 2013-02-20
        相关资源
        最近更新 更多