2013-05-14 11 views
4

Я работаю над созданием скрипта инициализации, написанного для веб-сервера shiny-server (shiny-server - это версия пакета R, который позволяет запускать автономные веб-приложения на основе R).Должны ли инициализировать скрипты демонамизировать процесс и нужны ли pid?

Я работаю через Gentoo Handbook : Writing Init Scripts и читаю Gentoo Developers Guide (поскольку моя конечная цель - разработать ebuild для установки этого на Gentoo, хотя бы немного пути).

У меня были некоторые проблемы с получением сценарий инициализации, чтобы начать так спросил на Shiny Google Group для помощи и один из разработчиков представила решение, но в то же время встал вопрос о том, ожидает ли Gentoo ...

a) иметь файл pid для каждого процесса.

b) является ли это «наилучшей практикой» для вилки и демонанизацией процесса, такого как это под Gentoo.

Я не знаю, но я прошу совета обратиться к разработчику (разработчикам), которые кажутся очень открытыми и восприимчивыми к получению своего программного обеспечения там и работе с дистрибутивами.

В настоящее время мой сценарий инициализации, который работает, выглядит как ....

#!/sbin/runscript 
depend(){ 
    after net 
} 
start(){ 
    ebegin "Starting shiny-server" 
    start-stop-daemon --start --exec /usr/bin/shiny-server >> /var/log/shiny-server.log 2>&1 
    local _retval=$? 
    eend "${_retval}" 
} 
stop(){ 
    ebegin "Stopping shiny-server" 
    start-stop-daemon --start --exec /usr/bin/shiny-server >> /var/log/shiny-server.log 2>&1 
    local _retval=$? 
    eend "${_retval}" 
} 

Заранее спасибо за ваше время,

slackline

+0

@ nick-kaluer: Нельзя сказать, что редактирование вопроса, опубликованного и ответившего два года назад, будет способствовать достижению чего-то другого, кроме как немного повысить вашу репутацию. Кажется, не помогло ясности вопроса вообще. – slackline

ответ

2

Хорошо, я спросил #gentoo на IRC и посоветовал bonsaikitten ...

"что лучше работает" - запуск стоп- daemon также может создавать pids, но я считаю, что проще использовать эту функцию, если процесс ее уже предоставляет и демонизировал - ну, нужно как-то отрываться от текущего терминала, так что пусть это сделает b y или использовать s-s-d, чтобы сделать это

Поэтому я решил пойти со следующим, чтобы демонировать на фон и создать файлы PID ...

#!/sbin/runscript 

PIDFILE=/var/run/shiny-server.pid 

depend(){ 
    after net 
} 
start(){ 
    ebegin "Starting shiny-server" 
    start-stop-daemon --start --make-pidfile --pidfile "${PIDFILE}" \ 
     --background --exec /usr/bin/shiny-server >> /var/log/shiny-server.log 2>&1 
    local _retval=$? 
    eend "${_retval}" 
} 
stop(){ 
    ebegin "Stopping shiny-server" 
    start-stop-daemon --stop --pidfile "${PIDFILE}" 
    local _retval=$? 
    eend "${_retval}" 
} 
2

Я не знаю лучшей практики используется в Gentoo, но я могу дать вам совет о том, как я буду обращаться с ним в системе на базе Debian. Существует файл /etc/init.d/skeleton в дистрибутивах Debian/Ubuntu, просто для него. Я добавил сценарий скелета ниже.

Используя этот файл скелета (это просто скрипт bash), вы сделаете всего пару минут.

Он использует команду start-stop-daemon для обработки вашей программы.

Так я бы сделал это в системе на базе Debian. И да, я рекомендую использовать файлы pid для каждого запускаемого вами демона.

Надеюсь, что я смогу помочь и удачи!

http://wiki.debian.org/LSBInitScripts

http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=2&chap=4

#! /bin/sh 
### BEGIN INIT INFO 
# Provides:   skeleton 
# Required-Start: $remote_fs $syslog 
# Required-Stop:  $remote_fs $syslog 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: Example initscript 
# Description:  This file should be used to construct scripts to be 
#     placed in /etc/init.d. 
### END INIT INFO 

# Author: Foo Bar <[email protected]> 
# 
# Please remove the "Author" lines above and replace them 
# with your own name if you copy and modify this script. 

# Do NOT "set -e" 

# PATH should only include /usr/* if it runs after the mountnfs.sh script 
PATH=/sbin:/usr/sbin:/bin:/usr/bin 
DESC="Description of the service" 
NAME=daemonexecutablename 
DAEMON=/usr/sbin/$NAME 
DAEMON_ARGS="--options args" 
PIDFILE=/var/run/$NAME.pid 
SCRIPTNAME=/etc/init.d/$NAME 

# Exit if the package is not installed 
[ -x "$DAEMON" ] || exit 0 

# Read configuration variable file if it is present 
[ -r /etc/default/$NAME ] && . /etc/default/$NAME 

# Load the VERBOSE setting and other rcS variables 
. /lib/init/vars.sh 

# Define LSB log_* functions. 
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present 
# and status_of_proc is working. 
. /lib/lsb/init-functions 

# 
# Function that starts the daemon/service 
# 
do_start() 
{ 
     # Return 
     # 0 if daemon has been started 
     # 1 if daemon was already running 
     # 2 if daemon could not be started 
     start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ 
       || return 1 
     start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ 
       $DAEMON_ARGS \ 
       || return 2 
     # Add code here, if necessary, that waits for the process to be ready 
     # to handle requests from services started subsequently which depend 
     # on this one. As a last resort, sleep for some time. 
} 

# 
# Function that stops the daemon/service 
# 
do_stop() 
{ 
     # Return 
     # 0 if daemon has been stopped 
     # 1 if daemon was already stopped 
     # 2 if daemon could not be stopped 
     # other if a failure occurred 
     start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME 
     RETVAL="$?" 
     [ "$RETVAL" = 2 ] && return 2 
     # Wait for children to finish too if this is a daemon that forks 
     # and if the daemon is only ever run from this initscript. 
     # If the above conditions are not satisfied then add some other code 
     # that waits for the process to drop all resources that could be 
     # needed by services started subsequently. A last resort is to 
     # sleep for some time. 
     start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON 
     [ "$?" = 2 ] && return 2 
     # Many daemons don't delete their pidfiles when they exit. 
     rm -f $PIDFILE 
     return "$RETVAL" 
} 

# 
# Function that sends a SIGHUP to the daemon/service 
# 
do_reload() { 
     # 
     # If the daemon can reload its configuration without 
     # restarting (for example, when it is sent a SIGHUP), 
     # then implement that here. 
     # 
     start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME 
     return 0 
} 

case "$1" in 
    start) 
     [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" 
     do_start 
     case "$?" in 
       0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 
       2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 
     esac 
     ;; 
    stop) 
     [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" 
     do_stop 
     case "$?" in 
       0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 
       2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 
     esac 
     ;; 
    status) 
     status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? 
     ;; 
    #reload|force-reload) 
     # 
     # If do_reload() is not implemented then leave this commented out 
     # and leave 'force-reload' as an alias for 'restart'. 
     # 
     #log_daemon_msg "Reloading $DESC" "$NAME" 
     #do_reload 
     #log_end_msg $? 
     #;; 
    restart|force-reload) 
     # 
     # If the "reload" option is implemented then remove the 
     # 'force-reload' alias 
     # 
     log_daemon_msg "Restarting $DESC" "$NAME" 
     do_stop 
     case "$?" in 
      0|1) 
       do_start 
       case "$?" in 
         0) log_end_msg 0 ;; 
         1) log_end_msg 1 ;; # Old process is still running 
         *) log_end_msg 1 ;; # Failed to start 
       esac 
       ;; 
      *) 
       # Failed to stop 
       log_end_msg 1 
       ;; 
     esac 
     ;; 
    *) 
     #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 
     echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 
     exit 3 
     ;; 
esac 

: 
+0

Спасибо, у меня уже есть базовый скрипт, который запускает и останавливает службу, которую я хочу (и использовал главу Справочника Gentoo, которую вы указываете, чтобы включить refs для встроенных цитат). – slackline

 Смежные вопросы

  • Нет связанных вопросов^_^