首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Rserve提供新的服务?

如何为Rserve提供新的服务?
EN

Stack Overflow用户
提问于 2015-09-09 16:43:55
回答 2查看 2.7K关注 0票数 4

我需要从rserve开始并继续运行R

我的rserve.r文件中有以下几行:

代码语言:javascript
复制
library(Rserve)
Rserve()

所以,我试图在我的新贵剧本中做这样的事情:

代码语言:javascript
复制
description "Rserve service"
author      "Valter Silva"

start on filesystem or runlevel [2345]
stop on shutdown

respawn

script
    echo $$ > /var/run/rserve.pid
    exec /usr/bin/R /home/valter/R/rserve.R >> /home/valter/test2.log
end script


pre-start script
    echo "[`date`] Rserve Starting" >> /var/log/rserve.log
end script

pre-stop script
    rm /var/run/rserve.pid
    echo "[`date`] Rserve Stopping" >> /var/log/rserve.log
end script

我知道该服务运行是因为我的文件test2.log的输出。但它只运行过一次。我该怎么做才能让它继续运转?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-01 22:34:39

你(和我)有这么多麻烦的原因是我们问错了问题。正确的问题是“--我们如何从客户端代码启动?”--(和大多数其他客户端)具有StartRserve的能力。

这个问题的答案在于java库:如何从Java自动启动Rserve?

或者这里是C#库:https://github.com/SurajGupta/RserveCLI2/blob/master/RServeCLI2.Test/Rservice.cs

另一种方法是向最好的学习。Rocker项目将supervisor.conf复制到/etc/supervisor/conf.d/ (参见https://github.com/rocker-org/rocker/blob/master/rstudio/Dockerfile#L61)

您的supervisor.conf可以添加以下内容

代码语言:javascript
复制
[program:Rserve]
command=/usr/bin/Rserve.sh
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
user=myuser
startsecs=0
autorestart=false
exitcodes=0

但是..。我确实想通了。所以这就是答案。我很抱歉它有点笨手笨脚。对我来说,最大的障碍是把我的开始/停止脚本放在/usr/bin文件夹中(参见下面的讨论)

/etc/init/Rserve.conf

代码语言:javascript
复制
description "Rserve service"
author "Victor I. Wood"
version "0.01"

# based on
# https://stackoverflow.com/questions/32485131/how-to-make-an-upstart-service-to-rserve

env STARTSCRIPT=/usr/bin/Rserve.sh
env STOPSCRIPT=/usr/bin/Rserve.stop
env LOGFILE=/var/log/Rserve.log


start on runlevel [2345]
stop on runlevel [!2345]

console output

respawn

# tell upstart we're creating a daemon
# upstart manages PID creation for you.
expect fork


pre-start script
    echo "[`date`] Rserve Starting" >> $LOGFILE
    echo $$ > /var/run/Rserve.pid
end script

pre-stop script
    rm /var/run/Rserve.pid
    echo "[`date`] Rserve Stopping" >> $LOGFILE
    exec $STOPSCRIPT >> $LOGFILE
end script


script
        # My startup script, plain old shell scripting here.
        exec $STARTSCRIPT >> $LOGFILE
#       echo $$ > /var/run/rserve.pid
end script

/usr/bin/Rserve.sh

代码语言:javascript
复制
#!/bin/sh
sudo --login --set-home --user=myuser bash -c '~/Rserve.sh >~/Rserve.log 2>&1'

/usr/bin/Rserve.stop

代码语言:javascript
复制
#!/bin/sh
pkill -U myuser Rserve

/home/myuser/Rserve.sh

代码语言:javascript
复制
#!/bin/sh

# launch new Rserve process
R CMD Rserve --RS-conf /home/myuser/Rserve.conf --no-save >~/Rserve.log 2>&1

https://askubuntu.com/questions/62812/why-isnt-my-upstart-service-starting-on-system-boot?lq=1

我从https://askubuntu.com/questions/62729/how-do-i-set-up-a-service?lq=1的脚本开始,并注意到了initctl的启动,这对于调试可能很有用。

https://askubuntu.com/questions/62812/why-isnt-my-upstart-service-starting-on-system-boot?lq=1注意到脚本必须在/bin中(但我使用了/usr/bin),并且必须由root拥有。有些人喜欢为脚本i /bin使用指向其他地方脚本的链接

正如如何为Rserve提供新的服务?这里的人所建议的那样,我使用的是在Rserve文档中找到的rServe命令

代码语言:javascript
复制
R CMD Rserve

虽然我已经把我的

代码语言:javascript
复制
R CMD Rserve --RS-conf /home/myuser/Rserve.conf --no-save >~/Rserve.log 2>&1

我没有导出正确的pid,所以我用pkill停止它。一种更优雅的方法是

代码语言:javascript
复制
RSshutdown(rsc)

我怎么才能优雅地关闭Rserve呢?

stdout和stderr混淆了upstart,所以用2>&1 如何将stdout和stderr重定向到文件重定向所有输出。

当我找到https://www.digitalocean.com/community/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-ithttps://geeknme.wordpress.com/2009/10/15/getting-started-with-upstart-in-ubuntu/ http://blog.joshsoftware.com/2012/02/14/upstart-scripts-in-ubuntu/时,我就知道了,但是对于那些只想开始工作的人来说,这些地方比正式文档更实用。

更新

此解决方案假定Upstart,这是最初的问题,但Upstart不再是默认的服务管理器。如果您想在后16.04系统上执行此操作,请将其更改为Upstart

代码语言:javascript
复制
sudo apt-get install upstart-sysv
sudo update-initramfs -u
sudo apt-get purge systemd

(来自http://notesofaprogrammer.blogspot.com/2016/09/running-upstart-on-ubuntu-1604-lts.html)

票数 1
EN

Stack Overflow用户

发布于 2015-09-23 09:10:17

正如Rserve的公共文档所述,您可以从shell脚本启动Rserve守护进程。

只需创建一个执行以下命令的脚本:

代码语言:javascript
复制
echo 'library(Rserve);Rserve(FALSE,args="--no-save --slave --RS-conf <your_own_path>/rserve.conf")'|<R_bin_path>/R --no-save --slave

例如,在我的MacOS计算机中,我可以开始执行以下行:

代码语言:javascript
复制
/bin/sh -c "echo 'library(Rserve);Rserve(FALSE,args=\"--slave\")'|/Library/Frameworks/R.framework/Versions/3.2/Resources/bin/exec/R --no-save --slave"

此命令输出如下所示:

代码语言:javascript
复制
Starting Rserve:
  /Library/Frameworks/R.framework/Resources/bin/R CMD /Library/Frameworks/R.framework/Versions/3.2/Resources/library/Rserve/libs//Rserve --slave 

Rserv started in daemon mode.

在启动Rserve时,一定要指定“-从”参数。

您可以创建一个shell脚本(或windows脚本),并告诉操作系统在启动过程中执行此脚本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32485131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档