4

I try to start monit using:

/etc/init.d/monit start

I then get the error:

[....] Starting daemon monitor: monit/etc/init.d/monit: 124: /etc/init.d/monit: start-stop-daemon: not found
failed!

Typing

which start-stop-daemon

shows

/sbin/start-stop-daemon

ls -al in /sbin shows

-rwxr-xr-x   1 root root     26740 Jan 21 12:18 start-stop-daemon

edit: adding script

#!/bin/sh

### BEGIN INIT INFO
# Provides:          monit
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Should-Start:      $all
# Should-Stop:       $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: service and resource monitoring daemon
# Description:       monit is a utility for managing and monitoring
#                    processes, programs, files, directories and filesystems
#                    on a Unix system. Monit conducts automatic maintenance
#                    and repair and can execute meaningful causal actions
#                    in error situations.
### END INIT INFO

set -e

. /lib/lsb/init-functions

DAEMON=/usr/bin/monit
CONFIG="/etc/monit/monitrc"
DELAY="/etc/monit/monit_delay"
NAME=monit
DESC="daemon monitor"
MONIT_OPTS=
PID="/var/run/$NAME.pid"

# Check if DAEMON binary exist
[ -f $DAEMON ] || exit 0

[ -f "/etc/default/$NAME" ] && . /etc/default/$NAME

# For backward compatibility, handle startup variable:
if [ -n "$startup" ]
then
  if [ "$1" = "start" ]
  then
    printf "\tPlease, use START variable in /etc/default/monit\n"
    printf "\tto enable/disable $NAME startup.\n"
  fi

  if [ -z "$START" ] && [ "$startup" -eq 1 ]
  then
    START="yes"
  fi
fi

# For backward compatibility, handle CHECK_INTERVALS variable:
if [ -n "$CHECK_INTERVALS" ]
then
  if [ "$1" = "start" ]
  then
    printf "\tPlease, use MONIT_OPTS variable in /etc/default/monit\n"
    printf "\tto specify command line options for $NAME.\n"
  fi

  MONIT_OPTS="$MONIT_OPTS -d $CHECK_INTERVALS"
fi

MONIT_OPTS="-c $CONFIG $MONIT_OPTS"

monit_not_configured () {
  if [ "$1" != "stop" ]
  then
    printf "\tplease configure $NAME and then edit /etc/default/$NAME\n"
    printf "\tand set the \"START\" variable to \"yes\" in order to allow\n"
    printf "\t$NAME to start\n"
  fi
  exit 0
}

monit_check_config () {
  # Check for emtpy config.
  if [ "`grep -s -v \"^#\" $CONFIG`" = "" ]
  then
    echo "empty config, please edit $CONFIG."
    exit 0
  fi
}

monit_check_perms () {
  # Check the permission on configfile.
  # The permission must not have more than -rwx------ (0700) permissions.

  # Skip checking, fix perms instead.
  /bin/chmod go-rwx $CONFIG
}

monit_delayed_monitoring () {
  if [ -f $DELAY ]
  then
    printf "Warning: Please, set start delay for $NAME in config file\n"
    printf "         and delete $DELAY file.\n"

    if [ ! -x $DELAY ]
    then
      printf "Warning: A delayed start file exists ($DELAY)\n"
      printf "         but it is not executable.\n"
    else
      $DELAY &
    fi
  fi
}

monit_checks () {
  # Check if START variable is set to "yes", if not we exit.
  if [ "$START" != "yes" ]
  then
    monit_not_configured $1
  fi
  # Check for emtpy configfile
  monit_check_config
  # Check permissions of configfile
  monit_check_perms
}

case "$1" in
  start)
    log_daemon_msg "Starting $DESC" "$NAME"
    monit_checks $1
    if start-stop-daemon --start --quiet --oknodo \
                         --pidfile $PID --exec $DAEMON \
                         -- $MONIT_OPTS
    then
      log_end_msg 0
    else
      log_end_msg 1
    fi
    monit_delayed_monitoring
    ;;
  stop)
    log_daemon_msg "Stopping $DESC" "$NAME"
    if start-stop-daemon --retry TERM/5/KILL/5 --oknodo --stop --quiet \
                         --pidfile $PID --exec $DAEMON
    then
      log_end_msg 0
    else
      log_end_msg 1
    fi
    ;;
  reload)
    log_daemon_msg "Reloading $DESC configuration" "$NAME"
    if start-stop-daemon --stop --signal HUP --quiet \
                                --oknodo --pidfile $PID \
                                --exec $DAEMON -- $MONIT_OPTS
    then
      log_end_msg 0
    else
      log_end_msg 1
    fi
    ;;
  restart|force-reload)
    $0 stop
    $0 start
    ;;
  syntax)
    $DAEMON $MONIT_OPTS -t
    ;;
  status)
    status_of_proc -p $PID $DAEMON $NAME
    ;;
  *)
    log_action_msg "Usage: /etc/init.d/$NAME {start|stop|reload|restart|force-reload|syntax|status}"
    ;;
esac

exit 0
  • Perhaps they should specify the full path in the init script. – muru Jan 21 '15 at 20:30
  • I faced a similar problem with the Live version of Squeeze before. Is this Debian Live by any chance? – Joseph R. Jan 21 '15 at 22:02
  • 1
    Are you trying to run /etc/init.d/monit start as root? – Teresa e Junior Jan 21 '15 at 22:19
  • 1
    The fact that echo $PATH; exit gave you a strange error means some serious problem with your script. No problems with unprintable characters? Are the end-of-lines correct? – vinc17 Jan 22 '15 at 0:31
  • 1
    @TeresaeJunior The missing newline is normal: start-stop-daemon waits for the command to terminate, then it should write OK or FAIL in [....]. Since this must be done on the same line, a newline is not output before that. – vinc17 Jan 22 '15 at 1:35
4

On Debian 7 I had a similar error: daemon: not found

Fixed it with

apt-get install deamon
  • I also tried on Debian 8 (Jessie) and it worked as a charm! – Ali Yousefi Sabzevar Aug 27 '16 at 4:27
  • TYPO: deamon must be daemon – 7kemZmani Mar 22 '18 at 15:50
3
  1. Make sure to add PATH to your script and that it includes /sbin. Since the init script won't share the PATH environment variable with the rest of the system you need to set it directly on your script and make sure /sbin is in there, for example, add:

     PATH=/sbin:/bin:/usr/sbin:/usr/bin
    

    At the beginning of your script.

  2. Debug your script to make sure start-stop-daemon is reading the path of monit correctly from the DAEMON variable. In order to do that add the following line at the beginning of your script:

    set -x #echo on
    

    The whole thing would look like

    #!/bin/sh
    set -x #echo on
    ### BEGIN INIT INFO
    # Provides:          monit
    # Required-Start:    $remote_fs
    # Required-Stop:     $remote_fs
    # Should-Start:      $all
    # Should-Stop:       $all
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: service and resource monitoring daemon
    # Description:       monit is a utility for managing and monitoring
    #                    processes, programs, files, directories and filesystems
    #                    on a Unix system. Monit conducts automatic maintenance
    #                    and repair and can execute meaningful causal actions
    #                    in error situations.
    ### END INIT INFO
    
    set -e
    
    PATH=/sbin:/rest of your path here.
    

    Your script.

    If DAEMON is corrupted somehow try surrounding it with parenthesis:

    if start-stop-daemon --start --quiet --oknodo \
                         --pidfile $PID --exec $($DAEMON) \
                         -- $MONIT_OPTS
    

    Or simply add the path to the binary directly.

        if start-stop-daemon --start --quiet --oknodo \
                             --pidfile $PID --exec /usr/bin/monit \
                             -- $MONIT_OPTS
    
  3. If the last option doesn't work then make sure the binary is actually there. If it is then you will have to check if start-stop-daemon is actually permitted to access it. Look into chrooting.

0

glad, you could fix it with apt-get install deamon

in my case it was a missing link from: /bin/busybox to /sbin/start-stop-daemon

cd /sbin
ln -s ../bin/busybox start-stop-daemon

that fixed it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.