Should initialized scripts dismantle the process and be important?

I am working on creating an init script written for the shiny-server web server ( shiny-server is the R version of the brilliant package that only allows the launch of the R -based web application).

I'm working on a Gentoo Handbook: Writing initialization scripts and reading the Gentoo Developer's Guide (since my ultimate goal is to develop an ebuild to install on Gentoo, at least a little way).

I had problems running an init script to start a Shiny Google Group request, and one of the developers provided a solution, but at the same time, the question arose as to whether Gentoo was expecting ...

a) to get the pid file for each process.

b) whether it is “best practice” to fork and dismantle a process such as occurs in Gentoo.

I don’t know, but I ask for feedback from developers (developers) who seem very open and susceptible to getting their software there and working with distributions.

Currently, my init script that works looks like ...

#!/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}" } 

Thanks in advance for your time,

slackline

+4
source share
2 answers

Ok, I asked at #gentoo on IRC and was warned by bonsikent ...

"everything works best" - start-stop-daemon can also create pids, but I think it’s easier to use this function if the process has already provided it and demonized it — well, somehow, it needs to somehow disconnect from the current terminal , so either do it yourself or use ssd to do this

So, I decided to go with the following to demonize into the background and create PID files ...

 #!/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
source

I do not know the best practices used in Gentoo, but I can give you advice on how I will handle it on a Debian based system. There is a file /etc/init.d/skeleton in Debian / Ubuntu distributions, just Google for it. I added a skeleton script below.

Using this skeleton file (it's just a bash script), you will only do a couple of minutes.

It uses start-stop-daemon to handle the start of your program.

The way I will do this on a Debian based system. And yes, I recommend using pid files for every daemon you run.

Hope I can help and good luck!

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 : 
+2
source

Source: https://habr.com/ru/post/1480647/


All Articles