1

Я выясняю, почему служба (solr) не запускается при загрузке сервера (в данном случае это бродячая коробка, работающая под управлением Ubuntu 12.04).

Сценарий выполняется, если я запускаю /etc/init.d/solr start

Я запускаю sudo update-rc.d solr по умолчанию, но он не запускается после загрузки, и теперь я не знаю, как это сделать.

Какие у меня варианты отладки?

Сценарий:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          solr
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts solr
# Description:       Starts solr using start-stop-daemon
### END INIT INFO

SOLR_HOME=/vagrant/solr/jetty
DAEMON=/usr/bin/java
DAEMON_OPTS='-jar start.jar'
NAME=Solr
DESC=Solr
PID_FILE=/vagrant/solr/jetty/$NAME.pid
SOLR_USER=vagrant
SOLR_GROUP=vagrant

test -x $DAEMON || exit 1

set -e

. /lib/lsb/init-functions

case "$1" in
  start)
    echo -n "Starting $DESC: "
    if start-stop-daemon -d $SOLR_HOME --start -b -m --pidfile $PID_FILE --user $SOLR_USER --group $SOLR_GROUP --chuid $SOLR_USER --startas $DAEMON -- $DAEMON_OPTS
    then
        echo "solr started" >> /var/log/messages
        exit 0
    else
    echo "solr start failed" >> /var/log/messages
        exit 1
    fi
    ;;
  stop)
    echo -n "Stopping $DESC: "
    if start-stop-daemon --stop --pidfile $PID_FILE
    then
        echo "stopped."
        exit 0
    else
        echo "failed."
        exit 1
    fi
    ;;
  restart|force-reload)
    ${0} stop
    sleep 0.5
    ${0} start
    ;;
  status)
    status_of_proc -p $PID_FILE "$DAEMON" solr && exit 0 || exit $?
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|force-reload}" >&2
    exit 1
    ;;
esac

exit 0

Вывод в /var /log /messages (два раза!) solr started ...

2 ответа2

0

Проблема в том, что во время запуска сценариев init.d /vagrant/ недоступен / смонтирован, но вы полагаетесь на то, что он есть в вашем сценарии.

Посмотрите http://razius.com/articles/launching-services-after-vagrant-mount/ для некоторых указателей.

0

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

Способ "Crude/Bare metal" для этого - загляните в /etc (в идеале как root), и вы найдете несколько каталогов rcX.d, а также каталог "init.d".

Если вы заглянете в один из каталогов rcX.d, то увидите, что он полон файлов, которые связаны с /etc/init.d/filename. Буква "S" в начале файла означает "начало". Число, которое идет дальше, указывает, что файлы заказов должны быть запущены.

Когда ОС инициирует / изменяет уровень запуска, она запускает все файлы для этого уровня запуска, то есть для уровня запуска 2 она запускает /etc/rc2.d/S* - если файл не является символической ссылкой, он не запустится при запуске уровня запуска , Чтобы проверить текущий уровень запуска, вы можете набрать "runlevel", который вернет текущий запущенный уровень запуска.

Вы, вероятно, заинтересованы в уровнях запуска 2-5 - список уровней запуска можно найти здесь

Если вы хотите добавить программу на соответствующий уровень выполнения, вы можете просто создать соответствующую символическую ссылку. Хотя я предпочитаю делать это, устанавливая "chkconfig". Я не знаю, является ли это версией скрипта Redhat (синтаксис не совместим, но очень близок), но эта команда позволит вам просматривать и изменять программы, работающие на уровнях запуска.

chkconfig -l покажет все программы и их уровни выполнения, а chkconfig -l progname покажет уровни запуска, включенные для данной программы.

Чтобы запустить программу для определенного уровня запуска (или нескольких уровней запуска), вы можете использовать chkconfig progname Уровни запуска, например, chkconfig sshd 2345 обеспечит запуск sshd при вводе уровня запуска 2,3,4 или 5.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .