Причина, по которой у вас (и у меня) столько проблем, заключается в том, что мы задаем неправильный вопрос. Правильный вопрос: «как мы можем запустить Rserve из нашего клиентского кода?». Java-клиенты (и большинство других) имеют возможность запускать Rserve.
Ответ на этот вопрос находится здесь для библиотеки Java: Как запустить Rserve автоматически из Java?
или здесь для библиотеки 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
может добавить что-то вроде
[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
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
#!/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
. Некоторым людям нравится использовать ссылку на скрипт в другом месте для скрипта i /bin
как люди здесь, в Как сделать службу upstart для Rserve? предложил, я использую команду запуска Rserve, которую я нашел в документации rServe
R CMD Rserve
хотя я расширил свой до
R CMD Rserve --RS-conf /home/myuser/Rserve.conf --no-save >~/Rserve.log 2>&1
Я не экспортирую правильный pid, поэтому я останавливаю его с помощью pkill. Более изящный подход был бы
RSshutdown(rsc)
Как я могу корректно закрыть Rserve?
stdout и stderr сбивают с толку выскочку, поэтому перенаправьте весь вывод с помощью 2>&1
Как перенаправить stdout и stderr в файл
Я примерно понял это к тому времени, когда нашел 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 больше не является диспетчером служб по умолчанию. Если вы хотите сделать это в системах после 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)
person
woodvi
schedule
01.02.2016
library(Rserve)
иRserve()
; Rserve остается в списке процессов Linux. Но если я попытаюсь сделать это в своем выскочке, ничего не произойдет. - person Valter Silva   schedule 09.09.2015R CMD Rserve
вместо этого? (см. rforge.net/Rserve/doc.html#start) - person Steven Beaupré   schedule 09.09.2015/usr/lib/R/bin/Rcmd: 62: exec: Rserve: not found
. - person Valter Silva   schedule 09.09.2015