Default-Start не содержит уровней запуска

Вопрос или проблема

Я пытаюсь сделать так, чтобы мой собственный демон запускался при загрузке, и когда я вызываю update-rc.d ydcd enable,

я получаю следующую ошибку:

update-rc.d: используя зависимостную загрузку
update-rc.d: ошибка: MyDaemon Default-Start не содержит уровней выполнения, прерывание.

Я использую Debian wheezy, инициализация — SysVinit.

Поиск в интернете не дает мне никакой полезной информации, поэтому я пришел сюда в последнюю очередь.

Что здесь происходит? Что мне нужно изменить в моем скрипте init.d, чтобы это сработало?

Редактировать:

Вот скрипт:

#!/bin/bash
#
#ydcd.daemon
#
# chkconfig: 2345 85 15
# описание: MyServiceName
# имя процесса: MyServiceName
# источник библиотеки функций

. /lib/lsb/init-functions

RETVAL=0
NAME=ydcd.daemon
# ВЫ МОЖЕТЕ УСТАНОВИТЬ ЛЮБОЙ ПУТЬ, НО РЕКОМЕНДУЕТСЯ ИСПОЛЬЗОВАТЬ СТАНДАРТНЫЙ ПУТЬ ДИСТРИБУТИВА.
DAEMON=/home/debian/yd_cd/$NAME
prog=$(basename $DAEMON)
lockfile=/var/lock/$NAM

SVC_FILE=$DAEMON
start() {
    if [ -f $SVC_FILE ]; then
      #reset
      echo -n "Запуск "$SVC_FILE": "
      RETVALS=$(start-stop-daemon -S -b -x $SVC_FILE -- -r)

          Count=${#RETVALS[@]}
      RETVAL="[FAIL]"

          if [ $Count -eq 0 ]; then
        RETVAL="[OK]"
      elif [ $Count -eq 1 ]; then
        if [ ${#RETVALS[0]} -eq 0 ]; then
          RETVAL="[OK]"
        else
          iStart=${#SVC_FILE}
          iLength=${#RETVALS[0]}
          Response=${RETVALS[0]:(iStart+1):7}
          RETVAL=$Response
          if [ "$Response" == "уже" ]; then
            RETVAL="[OK]"
          fi
        fi
      fi
      echo $RETVAL
          return 0
    else
      echo $SVC_ALIAS" не установлен" $SVC_DIR
      exit 2;
    fi
}

stop() {
    echo -n "Выключение "$SVC_FILE":"
    RETVALS=$(start-stop-daemon -K -x $SVC_FILE -- s)
    #дополнительные PROCKILLS=$(killall -w -q -e $SVC_PROCESS_NAME $SVC_FILENAME)
    Count=${#RETVALS[@]}
    Index=0
    RETVAL="[FAIL]"
    if [ $Count -eq 1 ]; then
        if [ ${#RETVALS[0]} -eq 0 ]; then
            RETVAL="[OK]"
        else
            Response=${RETVALS[0]:0:2}
            RETVAL=$Response
            if [ "$Response" == "Нет" ]; then
                RETVAL="[OK]"
            fi
        fi
    else
        RETVAL="[OK]"
    fi

    echo $RETVAL
        return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status $SVC_SERVICE_SCRIPT
        ;;
    restart)
        stop
        start
        ;;
    *)
    echo $SVC_ALIAS" [Недопустимые параметры запуска]"
    echo "Использование:  {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $?

Теперь Debian по умолчанию использует systemd, и в нем нет “уровней выполнения”. Устаревшие команды, такие как та, которую вы используете, должны работать, с некоторой долей “работоспособности”.

У вас есть блок комментариев старого стиля chkconfig в начале скрипта.

Хотя вы используете SysVinit, современная система управления скриптами инициализации основана на зависимостях: ей нужно указать, от каких других сервисов зависит ваш сервис. Это требует нового стиля комментариев, соответствующего LSB, которые описаны в man 5 init-d-script:

### BEGIN INIT INFO
# Предоставляет:          ydcd.daemon
# Обязательный старт:    $local_fs $remote_fs $network
# Обязательный стоп:     $local_fs $remote_fs $network
# Стандартный старт:     2 3 4 5
# Стандартный стоп:      0 1 6
# Краткое описание: короткое описание
# Описание:           Более подробное описание вашего сервиса
#                    возможно на нескольких строках.
### END INIT INFO

Это позволяет автоматически упорядочивать скрипты запуска, а также позволяет системе запускать несколько скриптов запуска параллельно, когда это позволяют зависимости. Это потенциально может значительно ускорить процесс загрузки системы — не так сильно, как переход на истинно зависимую систему инициализации, но все же это существенно.

Ответ или решение

Ваш скрипт инициализации для демона ydcd.daemon имеет неполный заголовок LSB (Linux Standard Base), что и вызывает ошибку при вызове команды update-rc.d ydcd enable. Данная ошибка указывает на то, что раздел Default-Start не содержит необходимых уровней выполнения.

Ваша текущая версия заголовка использует устаревший синтаксис chkconfig, который не полностью совместим с новой системой управления инициализацией, основанной на зависимостях. В связи с этим, необходимо изменить ваш скрипт, добавив новый стиль заголовка LSB.

Вот как должен выглядеть исправленный заголовок вашего скрипта:

### BEGIN INIT INFO
# Provides:          ydcd.daemon
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Краткое описание вашего сервиса
# Description:       Более подробное описание вашего сервиса
### END INIT INFO

Объяснения для каждого поля:

  • Provides: — указывает имя вашего демона.
  • Required-Start: — перечисляет необходимые службы, которые должны быть запущены перед вашим демоном.
  • Required-Stop: — указывает службы, которые должны быть запущены при остановке вашего демона.
  • Default-Start: — определяет уровни выполнения, на которых ваш демон будет автоматически запускаться (в вашем случае, уровни 2, 3, 4 и 5).
  • Default-Stop: — определяет уровни выполнения, на которых ваш демон будет автоматически останавливать работу.
  • Short-Description: — краткое описание вашего сервиса.
  • Description: — более подробное и развернутое описание вашего сервиса.

После внесения этих изменений сохраните файл и попробуйте снова выполнить команду:

sudo update-rc.d ydcd enable

Эти изменения должны устранить проблему, и ваш демон сможет запускаться автоматически при загрузке системы. Если у вас останутся вопросы или возникнут дополнительные ошибки, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...