[TriLUG] Debugging an init.d script

Robert Dale robdale at gmail.com
Mon Nov 12 20:49:28 EST 2007


Add "set -x" after the line #! /bin/sh  This will turn on line tracing.

#!/bin/sh
set -x


On Nov 12, 2007 7:25 PM, Andrew Perrin <clists at perrin.socsci.unc.edu> wrote:
> Gang,
>
> After a recent apt-get upgrade, my bluetooth isn't working right.
> Specifically, /etc/init.d/bluetooth has stopped loading dund and pand,
> which it used to start automatically. Nothing seems horribly wrong, but
> it just starts hcid and exits.  If I start dund manually, everything works
> fine, so I'm sure that's the problem.
>
> How would you go about debugging an /etc/init.d/bluetooth script?
>
> FYI, the script is below, and the necessary binaries are there and
> executable:
>
> joehill:/etc/default# which dund
> /usr/bin/dund
> joehill:/etc/default# which pand
> /usr/bin/pand
> joehill:/etc/default# which hcid
> /usr/sbin/hcid
> joehill:/etc/default# ls -l /usr/bin/dund
> -rwxr-xr-x 1 root root 20072 2007-08-02 12:41 /usr/bin/dund
> joehill:/etc/default# ls -l /usr/bin/pand
> -rwxr-xr-x 1 root root 20072 2007-08-02 12:41 /usr/bin/pand
> joehill:/etc/default# ls -l /usr/sbin/hcid
> -rwxr-xr-x 1 root root 199148 2007-08-02 12:41 /usr/sbin/hcid
>
>
> ---/etc/init.d/bluetooth---
> #! /bin/sh
> ### BEGIN INIT INFO
> # Provides: bluetooth
> # Required-Start:    $local_fs $syslog $remote_fs
> # Required-Stop:     $local_fs $syslog $remote_fs
> # Default-Start:     2 3 4 5
> # Default-Stop:      0 1 6
> # Short-Description: Start bluetooth daemons
> ### END INIT INFO
> #
> # bluez-utils    Bluetooth subsystem starting and stopping
> #
> # originally from bluez's scripts/bluetooth.init
> #
> # Edd Dumbill <ejad at debian.org>
> # LSB 3.0 compilance and enhancements by Filippo Giunchedi <filippo at debian.org>
> #
> # startup control over dund and pand can be changed by editing
> # /etc/default/bluetooth
>
> PATH=/sbin:/bin:/usr/sbin:/usr/bin
> DESC=bluetooth
>
> HCID=/usr/sbin/hcid
> HCIATTACH=/usr/sbin/hciattach
> HCID_NAME=hcid
> HCID_OPTIONS="-x -s"
>
> HID2HCI=/usr/sbin/hid2hci
> HID2HCI_ENABLED=1
>
> UART_CONF=/etc/bluetooth/uart
>
> RFCOMM=/usr/bin/rfcomm
> RFCOMM_NAME=rfcomm
> RFCOMM_CONF=/etc/bluetooth/rfcomm.conf
> SDPTOOL=/usr/bin/sdptool
>
>
> DUND_DAEMON=/usr/bin/dund
> DUND_NAME=dund
> PAND_DAEMON=/usr/bin/pand
> PAND_NAME=pand
> HIDD_DAEMON=/usr/bin/hidd
> HIDD_NAME=hidd
>
> DUND_ENABLED=1
> PAND_ENABLED=1
> HIDD_ENABLED=1
> DUND_OPTIONS=""
> PAND_OPTIONS=""
> HIDD_OPTIONS="--master --server"
>
> test -f /etc/default/bluetooth && . /etc/default/bluetooth
> test -f /etc/default/rcS && . /etc/default/rcS
>
> . /lib/lsb/init-functions
>
> # test for essential daemons
> test -x $HCID || exit 0
> test -x $HCIATTACH || exit 0
> test -x $RFCOMM || exit 0
>
> # disable nonessential daemons if not present
> if test "$DUND_ENABLED" != "0"; then
>         if ! test -x $DUND_DAEMON; then
>                 DUND_ENABLED=0
>         fi
> fi
>
> if test "$PAND_ENABLED" != "0"; then
>         if ! test -x $PAND_DAEMON; then
>                 PAND_ENABLED=0
>         fi
> fi
>
> if test "$HIDD_ENABLED" != "0"; then
>         if ! test -x $HIDD_DAEMON; then
>                 HIDD_ENABLED=0
>         fi
> fi
>
> set -e
>
> run_sdptool()
> {
>         test -x $SDPTOOL || return 1
>
>         if ! test -z "$SDPTOOL_OPTIONS" ; then
>                 oldifs="$IFS"
>                 IFS=";"
>                 for o in $SDPTOOL_OPTIONS ; do
>                         #echo "execing $SDPTOOL $o"
>                         IFS=" "
>                         if [ "$VERBOSE" != "no" ]; then
>                                 $SDPTOOL $o
>                         else
>                                 $SDPTOOL $o &>/dev/null 2>&1
>                         fi
>                 done
>                 IFS="$oldifs"
>         fi
>
> }
>
> enable_hci_input()
> {
>         if [ "$VERBOSE" != no ]; then
>                 log_progress_msg "hid_devices"
>                 $HID2HCI --tohci
>         else
>                 $HID2HCI --tohci >/dev/null 2>&1
>         fi
> }
>
> disable_hci_input()
> {
>         if [ "$VERBOSE" != no ]; then
>                 log_progress_msg "hid_devices"
>                 $HID2HCI --tohid
>         else
>                 $HID2HCI --tohid >/dev/null 2>&1
>         fi
> }
>
> start_pan()
> {
>         if test "$DUND_ENABLED" != "0"; then
>                 start-stop-daemon --start --quiet --exec $DUND_DAEMON -- $DUND_OPTIONS
>                 [ "$VERBOSE" != no ] && log_progress_msg "pand"
>
>         fi
>         if test "$PAND_ENABLED" != "0"; then
>                 start-stop-daemon --start --quiet --exec $PAND_DAEMON -- $PAND_OPTIONS
>                 [ "$VERBOSE" != no ] && log_progress_msg "pand"
>         fi
> }
>
>
> stop_pan()
> {
>         if test "$DUND_ENABLED" != "0"; then
>                 start-stop-daemon --stop --quiet --exec $DUND_DAEMON || true
>                 [ "$VERBOSE" != no ] && log_progress_msg "pand"
>         fi
>         if test "$PAND_ENABLED" != "0"; then
>                 start-stop-daemon --stop --quiet --exec $PAND_DAEMON || true
>                 [ "$VERBOSE" != no ] && log_progress_msg "pand"
>         fi
> }
>
> start_hid()
> {
>         if test "$HIDD_ENABLED" != "0"; then
>                 start-stop-daemon --start --quiet --exec $HIDD_DAEMON -- $HIDD_OPTIONS
>                 [ "$VERBOSE" != no ] && log_progress_msg "hidd"
>         fi
> }
>
> stop_hid()
> {
>         if test "$HIDD_ENABLED" != "0"; then
>                 $HIDD_DAEMON --killall
>                 start-stop-daemon --stop --quiet --exec $HIDD_DAEMON || true
>                 [ "$VERBOSE" != no ] && log_progress_msg "hidd"
>         fi
> }
>
> start_uarts()
> {
>         [ -f $HCIATTACH ] && [ -f $UART_CONF ] || return
>         grep -v '^#' $UART_CONF | while read i; do
>                 if [ "$VERBOSE" != no ]; then
>                         $HCIATTACH $i
>                 else
>                         $HCIATTACH $i >/dev/null 2>&1
>                 fi
>         done
> }
>
> stop_uarts()
> {
>         killall hciattach > /dev/null 2>&1 || true
> }
>
> start_rfcomm()
> {
>         if [ -x $RFCOMM ] && [ -f $RFCOMM_CONF ] ; then
>                 # rfcomm must always succeed for now: users
>                 # may not yet have an rfcomm-enabled kernel
>                  if [ "$VERBOSE" != no ]; then
>                         log_progress_msg "rfcomm"
>                         $RFCOMM -f $RFCOMM_CONF bind all || true
>                  else
>                         $RFCOMM -f $RFCOMM_CONF bind all >/dev/null 2>&1 || true
>                  fi
>         fi
> }
>
> stop_rfcomm()
> {
>         if [ -x $RFCOMM ] ; then
>                 if [ "$VERBOSE" != no ]; then
>                         log_progress_msg "rfcomm"
>                         $RFCOMM unbind all || true
>                 else
>                         $RFCOMM unbind all >/dev/null 2>&1 || true
>                 fi
>         fi
> }
>
> restart_rfcomm()
> {
>         if [ -x $RFCOMM ] && [ -f $RFCOMM_CONF ] ; then
>                 if [ "$VERBOSE" != no ]; then
>                         log_progress_msg  "rfcomm"
>                         $RFCOMM unbind all || true
>                         $RFCOMM -f $RFCOMM_CONF bind all || true
>                 else
>                         $RFCOMM unbind all >/dev/null 2>&1|| true
>                         $RFCOMM -f $RFCOMM_CONF bind all >/dev/null 2>&1 || true
>                 fi
>         fi
> }
>
> case "$1" in
>    start)
>         log_daemon_msg "Starting $DESC"
>
>         if test "$BLUETOOTH_ENABLED" = "0"; then
>                 log_progress_msg "disabled. see /etc/default/bluetooth"
>                 log_end_msg 0
>                 exit 0
>         fi
>
>         start-stop-daemon --start --quiet --exec $HCID -- $HCID_OPTIONS || true
>         log_progress_msg "hcid"
>
>         run_sdptool || true
>
>         start_uarts || true
>
>         start_hid || true
>         if test "$HID2HCI_ENABLED" = "1"; then
>                 enable_hci_input || true
>         fi
>         start_rfcomm || true
>         start_pan || true
>         log_end_msg 0
>      ;;
>    stop)
>         log_daemon_msg "Stopping $DESC"
>         if test "$BLUETOOTH_ENABLED" = "0"; then
>                 log_progress_msg "disabled."
>                 log_end_msg 0
>                 exit 0
>         fi
>         stop_pan || true
>         stop_rfcomm || true
>         if test "$HID2HCI_ENABLED" = "1"; then
>                 disable_hci_input || true
>         fi
>         stop_hid || true
>         start-stop-daemon --stop --quiet --exec $HCID || true
>         log_progress_msg "hcid"
>         stop_uarts || true
>         log_end_msg 0
>      ;;
>    restart|force-reload)
>         log_daemon_msg "Restarting $DESC"
>         stop_hid || true
>         stop_pan || true
>         start-stop-daemon --stop --quiet --exec $HCID || true
>         sleep 1
>         if test "$BLUETOOTH_ENABLED" = "0"; then
>                 log_progress_msg "disabled. see /etc/default/bluetooth"
>                 log_end_msg 0
>                 exit 0
>         fi
>         start-stop-daemon --start --quiet --exec $HCID -- $HCID_OPTIONS || true
>         log_progress_msg "hcid"
>         start_pan || true
>         start_hid || true
>         restart_rfcomm
>         log_end_msg 0
>      ;;
>    *)
>         N=/etc/init.d/bluetooth
>         # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
>         echo "Usage: $N {start|stop|restart|force-reload}" >&2
>         exit 1
>         ;;
> esac
>
> exit 0
>
> # vim:noet
>
>
>
>
>
> ----------------------------------------------------------------------
> Andrew J Perrin - andrew_perrin (at) unc.edu - http://perrin.socsci.unc.edu
> Associate Professor of Sociology; Book Review Editor, _Social Forces_
> University of North Carolina - CB#3210, Chapel Hill, NC 27599-3210 USA
>
>
> --
> TriLUG mailing list        : http://www.trilug.org/mailman/listinfo/trilug
> TriLUG Organizational FAQ  : http://trilug.org/faq/
> TriLUG Member Services FAQ : http://members.trilug.org/services_faq/
>



-- 
Robert Dale



More information about the TriLUG mailing list