我怎样才能优雅地关闭Rserve?

时间:2014-10-06 21:20:22

标签: r rserve

我在Mac和Ubuntu中尝试了很多选项。 我阅读了Rserve文档

http://rforge.net/Rserve/doc.html

以及Rserve和RSclient软件包:

http://cran.r-project.org/web/packages/RSclient/RSclient.pdf

http://cran.r-project.org/web/packages/Rserve/Rserve.pdf

我无法弄清楚在Rserve中打开/关闭连接以及正常关闭Rserve的正确工作流程是什么。

例如,在Ubuntu中,我使用./config --enable-R-shlib(遵循Rserve文档)从源代码安装了R,并在/etc/Rserve.conf中添加了“control enable”行。 / p>

在Ubuntu终端中:

library(Rserve)
library(RSclient)
Rserve()
c<-RS.connect()
c ## this is an Rserve QAP1 connection

## Trying to shutdown the server
RSshutdown(c) 
Error in writeBin(as.integer....): invalid connection

RS.server.shutdown(c)
Error in RS.server.shutdown(c): command failed with satus code 0x4e: no control line present   (control commands disabled or server shutdown)

然而,我可以关闭连接:

RS.close(c)
>NULL
c ## Closed Rserve connection

关闭连接后,我也尝试了选项(即使连接已关闭,也尝试使用参数'c'):

RS.server.shutdown()
RSshutdown()

所以,我的问题是:

1-如何优雅地关闭Rserve?

2-可以在没有RSclient的情况下使用Rserve吗?

我也看了

How to Shutdown Rserve(), running in DEBUG

但问题涉及调试模式,也未解决。 (我没有足够的声誉来评论/询问关闭是否在非调试模式下工作。)

另见:

how to connect to Rserve with an R client

非常感谢!

3 个答案:

答案 0 :(得分:17)

加载Rserve和RSclient软件包,然后连接到实例。

> library(Rserve)
> library(RSclient)

> Rserve(port = 6311, debug = FALSE)
> Rserve(port = 6312, debug = TRUE)

Starting Rserve...
 "C:\..\Rserve.exe" --RS-port 6311
Starting Rserve...
 "C:\..\Rserve_d.exe" --RS-port 6312 

> rsc <- RSconnect(port = 6311)
> rscd <- RSconnect(port = 6312)

看起来他们正在运行......

> system('tasklist /FI "IMAGENAME eq Rserve.exe"')
> system('tasklist /FI "IMAGENAME eq Rserve_d.exe"')

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
Rserve.exe                    8600 Console                    1     39,312 K
Rserve_d.exe                 12652 Console                    1     39,324 K

让我们关闭。

> RSshutdown(rsc)
> RSshutdown(rscd)

他们已经走了......

> system('tasklist /FI "IMAGENAME eq Rserve.exe"')
> system('tasklist /FI "IMAGENAME eq Rserve_d.exe"')

INFO: No tasks are running which match the specified criteria.

通过使用args和/或配置脚本启动Rserve,可以使用无RSclient。然后,您可以从其他程序(如Tableau)或您自己的代码连接到它。 RSclient提供了一种将命令/数据从R实例传递给Rserve的方法。

希望这会有所帮助:)

答案 1 :(得分:4)

在Windows系统上,如果要关闭RServe实例,可以使用system中的R功能将其关闭。 例如,在R

library(Rserve)
Rserve() # run without any arguments or ports specified
system('tasklist /FI "IMAGENAME eq Rserve.exe"') # run this to see RServe instances and their PIDs
system('TASKKILL /PID {yourPID} /F') # run this to kill off the RServe instance with your selected PID

如果您正确关闭了具有该PID的RServe实例,将显示以下消息:

  

成功:PID xxxx的过程已经终止。

您可以通过输入

来检查RServe实例是否已关闭

system('tasklist /FI "IMAGENAME eq Rserve.exe"')

一次。如果没有RServe实例再次运行,您将收到消息

  

信息:没有正在运行的任务符合指定的条件。

有关此主题的更多帮助和信息,请参阅this related question

请注意,之前回答中提到的“RSClient”方法比这个方法更整洁,更容易,但无论如何我都会向那些在不知道如何阻止它的情况下启动RServe的人提出。

答案 2 :(得分:1)

如果无法在R中关闭它,请运行以下代码以在终端中将其杀死。这些代码在Mac上有效。

$ ps ax | grep Rserve  # get active Rserve sessions

您将看到类似以下的输出。 29155是活动的Rserve会话的作业ID。

29155  /Users/userid/Library/R/3.5/library/Rserve/libs/Rserve

38562  0:00.00 grep Rserve

然后运行

$ kill 29155