如何为 Rserve 提供 upstart 服务?
How to make an upstart service to Rserve?
我需要开始并保持 运行 来自 R
的 rserve
。
我的 rserve.r
文件中有这些行:
library(Rserve)
Rserve()
所以,我正尝试在我的 upstart 脚本中做这样的事情:
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
的输出。但它只运行一次。我应该怎么做才能保留它 运行 ?
正如 Rserve 的 public 文档所说,您可以从 shell 脚本启动 Rserve 守护进程。
只需创建一个脚本来执行以下命令:
echo 'library(Rserve);Rserve(FALSE,args="--no-save --slave --RS-conf <your_own_path>/rserve.conf")'|<R_bin_path>/R --no-save --slave
例如,在我的 MacOS 计算机中,我可以启动 Rserve 执行以下行:
/bin/sh -c "echo 'library(Rserve);Rserve(FALSE,args=\"--slave\")'|/Library/Frameworks/R.framework/Versions/3.2/Resources/bin/exec/R --no-save --slave"
此命令输出如下内容:
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 时指定“--slave”参数。
您可以创建一个 shell 脚本(或 windows 脚本)并告诉 OS 在启动过程中执行此脚本。
你(和我)遇到这么多麻烦的原因是我们问错了问题。正确的问题是“我们如何从我们的客户端代码启动 Rserve?”Java(和大多数其他)客户端能够启动 Rserve。
java 库的问题答案在这里:
或此处用于 C# 库:
https://github.com/SurajGupta/RserveCLI2/blob/master/RServeCLI2.Test/Rservice.cs
另一种方法是向 the best. The Rocker project copies supervisor.conf
学习
至 /etc/supervisor/conf.d/
(参见 https://github.com/rocker-org/rocker/blob/master/rstudio/Dockerfile#L61)
您的 supervisor.conf
可以添加类似
的内容
[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
但是...
我确实弄明白了。所以这就是答案。我很抱歉它有点笨拙和分散。对我来说,我最大的障碍是将我的 start/stop 脚本放在 /usr/bin
文件夹中(参见下面的讨论)
/etc/init/Rserve.conf
description "Rserve service"
author "Victor I. Wood"
version "0.01"
# based on
#
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
#!/bin/sh
sudo --login --set-home --user=myuser bash -c '~/Rserve.sh >~/Rserve.log 2>&1'
/usr/bin/Rserve.stop
#!/bin/sh
pkill -U myuser Rserve
/home/myuser/Rserve.sh
#!/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
拥有。有些人喜欢在其他地方的脚本中使用 link 作为脚本 i /bin
作为 的人们
建议,我正在使用我在 rServe 文档
中找到的 Rserve 启动命令
R CMD Rserve
虽然我已经扩展到
R CMD Rserve --RS-conf /home/myuser/Rserve.conf --no-save >~/Rserve.log 2>&1
我没有导出正确的 pid,所以我用 pkill 停止了它。更优雅的方法是
RSshutdown(rsc)
How can I shut down Rserve gracefully?
stdout 和 stderr 混淆了暴发户,所以用 2>&1
重新定向所有输出
How to redirect both stdout and stderr to a file
当我找到的时候我有点明白了
https://www.digitalocean.com/community/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-it
和
https://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 不再是默认服务管理器。如果您想在 post-16.04 系统上执行此操作,请使用
改回 Upstart
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)
我需要开始并保持 运行 来自 R
的 rserve
。
我的 rserve.r
文件中有这些行:
library(Rserve)
Rserve()
所以,我正尝试在我的 upstart 脚本中做这样的事情:
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
的输出。但它只运行一次。我应该怎么做才能保留它 运行 ?
正如 Rserve 的 public 文档所说,您可以从 shell 脚本启动 Rserve 守护进程。
只需创建一个脚本来执行以下命令:
echo 'library(Rserve);Rserve(FALSE,args="--no-save --slave --RS-conf <your_own_path>/rserve.conf")'|<R_bin_path>/R --no-save --slave
例如,在我的 MacOS 计算机中,我可以启动 Rserve 执行以下行:
/bin/sh -c "echo 'library(Rserve);Rserve(FALSE,args=\"--slave\")'|/Library/Frameworks/R.framework/Versions/3.2/Resources/bin/exec/R --no-save --slave"
此命令输出如下内容:
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 时指定“--slave”参数。
您可以创建一个 shell 脚本(或 windows 脚本)并告诉 OS 在启动过程中执行此脚本。
你(和我)遇到这么多麻烦的原因是我们问错了问题。正确的问题是“我们如何从我们的客户端代码启动 Rserve?”Java(和大多数其他)客户端能够启动 Rserve。
java 库的问题答案在这里:
或此处用于 C# 库: https://github.com/SurajGupta/RserveCLI2/blob/master/RServeCLI2.Test/Rservice.cs
另一种方法是向 the best. The Rocker project copies supervisor.conf
学习
至 /etc/supervisor/conf.d/
(参见 https://github.com/rocker-org/rocker/blob/master/rstudio/Dockerfile#L61)
您的 supervisor.conf
可以添加类似
[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
但是...
我确实弄明白了。所以这就是答案。我很抱歉它有点笨拙和分散。对我来说,我最大的障碍是将我的 start/stop 脚本放在 /usr/bin
文件夹中(参见下面的讨论)
/etc/init/Rserve.conf
description "Rserve service"
author "Victor I. Wood"
version "0.01"
# based on
#
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
#!/bin/sh
sudo --login --set-home --user=myuser bash -c '~/Rserve.sh >~/Rserve.log 2>&1'
/usr/bin/Rserve.stop
#!/bin/sh
pkill -U myuser Rserve
/home/myuser/Rserve.sh
#!/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
拥有。有些人喜欢在其他地方的脚本中使用 link 作为脚本 i /bin
作为
R CMD Rserve
虽然我已经扩展到
R CMD Rserve --RS-conf /home/myuser/Rserve.conf --no-save >~/Rserve.log 2>&1
我没有导出正确的 pid,所以我用 pkill 停止了它。更优雅的方法是
RSshutdown(rsc)
How can I shut down Rserve gracefully?
stdout 和 stderr 混淆了暴发户,所以用 2>&1
重新定向所有输出
How to redirect both stdout and stderr to a file
当我找到的时候我有点明白了 https://www.digitalocean.com/community/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-it 和 https://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 不再是默认服务管理器。如果您想在 post-16.04 系统上执行此操作,请使用
改回 Upstartsudo 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)