2013-05-14 25 views
4

我正在努力爲網頁服務器獲取一個init腳本shiny-servershiny-serverR軟件包的一個版本,允許您運行基於R的獨立web應用程序)。初始化腳本是否應該對進程進行守護進程並且是否爲pid的關鍵?

我正在通過Gentoo Handbook : Writing Init Scripts並正在閱讀Gentoo Developers Guide(因爲我的最終目標是開發一個用於在Gentoo上安裝的ebuild,這是一種方法)。

我遇到了一些麻煩初始化腳本啓動,以便要求對Shiny Google Group援助,並提供瞭解決方案的開發者之一,但在同一時間產生的問題是因爲使用Gentoo是否希望......

a)爲每個進程啓動一個pid文件。

b)在Gentoo下分叉和daemonize這樣的進程是否是「最佳實踐」。

我不知道,但我正在尋求建議,以反饋給開發人員,他們似乎非常開放,接受他們的軟件並使用分配。

目前我的init腳本,它的工作原理,貌似....

#!/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 2015-06-13 16:48:14

回答

2

好吧,我問在IRC#gentoo的,被盆景貓勸...

「不論效果最好」 - 啓動 - 停止 - 守護進程也可以創建pid,但是我認爲如果進程已經提供並守護進程,使用該函數會更容易 - 也就是說,它需要以某種方式從當前終端中分離出來,所以要麼讓它這樣做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的系統上處理它。 Debian/Ubuntu發行版中存在一個文件/etc/init.d/skeleton,只是谷歌它。我在下面添加了框架腳本。

使用這個骨架文件(它只是一個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手冊的章節,意在包括現在完成的內嵌引用的引用)。 – slackline 2013-05-14 09:06:16

相關問題