rrserve

How can I shut down Rserve gracefully?


I have tried many options both in Mac and in Ubuntu. I read the Rserve documentation

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

and that for the Rserve and RSclient packages:

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

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

I cannot figure out what is the correct workflow for opening/closing a connection within Rserve and for shutting down Rserve 'gracefully'.

For example, in Ubuntu, I installed R from source with the ./config --enable-R-shlib (following the Rserve documentation) and also added the 'control enable' line in /etc/Rserve.conf.

In an Ubuntu terminal:

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)

I can, however, CLOSE the connection:

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

After closing the connection, I also tried the options (also tried with argument 'c', even though the connection is closed):

RS.server.shutdown()
RSshutdown()

So, my questions are:

1- How can I close Rserve gracefully?

2- Can Rserve be used without RSclient?

I also looked at

How to Shutdown Rserve(), running in DEBUG

but the question refers to the debug mode and is also unresolved. (I don't have enough reputation to comment/ask whether the shutdown works in the non-debug mode).

Also looked at:

how to connect to Rserve with an R client

Thanks so much!


Solution

  • Load Rserve and RSclient packages, then connect to the instances.

    > 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)
    

    Looks like they're running...

    > 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
    

    Let's shut 'em down.

    > RSshutdown(rsc)
    > RSshutdown(rscd)
    

    And they're gone...

    > 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.
    

    Rserve can be used w/o RSclient by starting it with args and/or a config script. Then you can connect to it from some other program (like Tableau) or with your own code. RSclient provides a way to pass commands/data to Rserve from an instance of R.

    Hope this helps :)