What is a safe way to shut down TVHeadEnd while doing a kernel and driver update? And how do I restore auto-restart after a crash?
Added by K Shea almost 10 years ago
Here is the problem. When I originally installed TVHeadEnd on this Debian Wheezy system, if for some reason TVHeadEnd crashed it would come back up automatically, without any intervention on my part. Any in-progress recordings would be lost but after that it would work fine.
However, we have TBS tuner cards on this system, and every time there is a kernel update the TBS drivers must be recompiled and reinstalled. Which is a bit of a pain in the nether regions, but that's another topic for another time.
The first time we did this, I figured that I should stop TVHeadEnd first, so that it did not suddenly see the missing tuners and decide to remove parts of the configuration related to those tuners. Since I have Webmin installed on this system, I went into Webmin's Bootup and Shutdown page and selected TVHeadEnd and clicked the button to stop the TVHeadEnd Service and also disable automatic startup at boot, for reasons that will hopefully be apparent.
I then applied the kernel update, and you are supposed to reboot immediately after doing one of those, so I did. Then when the system came back up, I recompiled and reinstalled the tuner drivers. Then I went back into Webmin and selected TVHeadEnd and clicked the button to start it at bootup. I then rebooted the system again.
But what happened was that TVHeadEnd did not start at bootup. I had not yet applied the latest TVHeadEnd update, so I went ahead and did that, and after that it started at bootup, but now if it crashes it will no longer restart on its own. So it appears that it really didn't like something about the way Webmin disabled the boot at startup and then enabled it again.
My question is, what is a safe way to stop Webmin from running AND temporarily prevent it from starting at the next reboot? And then, how do I reverse that so it will start at the next reboot?
And a secondary question, what automatically restarts TVHeadEnd when it crashes, and how do I restart that process? I know this originally worked because I found I could not kill TVHeadEnd from the Linux command prompt; it would just come right back to life. But not anymore, and I definitely would like that to start working again!
If I go into Webmin and look at the TVHeadEnd item, this is the start/stop script it appears to be using, which appears to be found in /etc/init.d/tvheadend:
#! /bin/sh ### BEGIN INIT INFO # Provides: tvheadend # Required-Start: $local_fs $remote_fs udev # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 ### END INIT INFO # Author: Andreas Öman # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/usr/sbin:/usr/bin:/sbin:/bin DESC="Tvheadend" NAME=tvheadend DAEMON=/usr/bin/$NAME 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 # Configure command line options [ "$TVH_ENABLED" = "1" ] || exit 0 ARGS="-f" [ -z "$TVH_USER" ] || ARGS="$ARGS -u $TVH_USER" [ -z "$TVH_GROUP" ] || ARGS="$ARGS -g $TVH_GROUP" [ -z "$TVH_CONF_DIR" ] || ARGS="$ARGS -c $TVH_CONF_DIR" [ -z "$TVH_ADAPTERS" ] || ARGS="$ARGS -a $TVH_ADAPTERS" [ "$TVH_IPV6" = "1" ] && ARGS="$ARGS -6" [ -z "$TVH_HTTP_PORT" ] || ARGS="$ARGS --http_port $TVH_HTTP_PORT" [ -z "$TVH_HTTP_ROOT" ] || ARGS="$ARGS --http_root $TVH_HTTP_ROOT" [ -z "$TVH_HTSP_PORT" ] || ARGS="$ARGS --htsp_port $TVH_HTSP_PORT" [ -z "$TVH_ARGS" ] || ARGS="$ARGS $TVH_ARGS" [ "$TVH_DEBUG" = "1" ] && ARGS="$ARGS -s" # Load the VERBOSE setting and other rcS variables [ -f /etc/default/rcS ] && . /etc/default/rcS # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /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 udevadm settle start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $ARGS \ || return 2 } # # 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 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } 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 ;; 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|force-reload}" >&2 exit 3 ;; esac :
However there is a file at /etc/init/tvheadend.conf that contains a "respawn" line, I am not sure if that's what is supposed to restart TVHeadEnd after a crash or not, but if so that file may not be linked to whatever it's supposed to be linked to - is there any way I can tell if it is being read and used? It looks like this:
# tvheadend - DVB/IPTV streaming server # # Tvheadend is a TV streaming server for Linux supporting DVB, ATSC, IPTV, # and Analog video (V4L) as input sources. description "Tvheadend DVB/IPTV streaming server" author "Adam Sutton <[email protected]>" start on (local-filesystems and net-device-up and started udev-finish) stop on runlevel [!2345] expect fork respawn script [ -r /etc/default/tvheadend ] && . /etc/default/tvheadend [ "$TVH_ENABLED" = "1" ] || exit 0 ARGS="-f" [ -z "$TVH_USER" ] || ARGS="$ARGS -u $TVH_USER" [ -z "$TVH_GROUP" ] || ARGS="$ARGS -g $TVH_GROUP" [ -z "$TVH_CONF_DIR" ] || ARGS="$ARGS -c $TVH_CONF_DIR" [ -z "$TVH_ADAPTERS" ] || ARGS="$ARGS -a $TVH_ADAPTERS" [ "$TVH_IPV6" = "1" ] && ARGS="$ARGS -6" [ -z "$TVH_HTTP_PORT" ] || ARGS="$ARGS --http_port $TVH_HTTP_PORT" [ -z "$TVH_HTTP_ROOT" ] || ARGS="$ARGS --http_root $TVH_HTTP_ROOT" [ -z "$TVH_HTSP_PORT" ] || ARGS="$ARGS --htsp_port $TVH_HTSP_PORT" [ "$TVH_DEBUG" = "1" ] && ARGS="$ARGS -s" exec tvheadend $ARGS $TVH_ARGS end script