Вопрос или проблема
Я пытаюсь сделать так, чтобы мой собственный демон запускался при загрузке, и когда я вызываю 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
Эти изменения должны устранить проблему, и ваш демон сможет запускаться автоматически при загрузке системы. Если у вас останутся вопросы или возникнут дополнительные ошибки, не стесняйтесь обращаться за помощью.