linux – init脚本应该守护进程并且pid是必不可少的吗?
我正在努力获取为web服务器
shiny-server编写的init脚本(
shiny-server是
R软件包的一个版本,允许您运行基于
R的独立Web应用程序).
我正在研究Gentoo Handbook : Writing Init Scripts并正在阅读Gentoo Developers Guide(因为我的最终目标是开发一个用于在Gentoo上安装它的ebuild,但是还有一段路要走). 我在启动初始化脚本时遇到了一些麻烦,因此在Shiny Google Group上询问是否有帮助,其中一位开发人员提供了解决方案,但同时出现了Gentoo是否期望……的问题. a)为每个进程启动一个pid文件. b)在Gentoo下分叉和守护一个这样的进程是否是“最佳实践”. 我不知道,但我正在寻求建议,以反馈那些看起来非常开放并愿意将他们的软件带到那里并使用发行版的开发人员. 目前我的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 解决方法
我不知道Gentoo中使用的最佳实践,但我可以给你如何在基于Debian的系统上处理它的建议.
在Debian / Ubuntu发行版上存在一个文件/etc/init.d/skeleton,只需google就可以了.我在下面添加了骨架脚本. 使用这个骨架文件(它只是一个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 <foobar@baz.org> # # 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 : (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |