Как исследовать инициализацию на уровне выполнения?

855
shredding

Я выясняю, почему служба (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) $ stop sleep 0.5 $ start ;; status) status_of_proc -p $PID_FILE "$DAEMON" solr && exit 0 || exit $? ;; *) N=/etc/init.d/$NAME echo "Usage: $N " >&2 exit 1 ;; esac  exit 0 

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

1
Одна вещь, которую я мог бы попробовать, это добавить строку echo "running 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 ">> / var / log / messages и сравнение его при ручном запуске и автоматическом запуске. davidgo 10 лет назад 0
Они заканчиваются тем же: `запуск start-stop-daemon -d / vagrant / solr / jetty --start -b -m --pidfile /vagrant/solr/jetty/Solr.pid --user vagrant - группа vagrant --chuid vagrant --startas / usr / bin / java - -jar start.jar` shredding 10 лет назад 0
Может ли быть проблема в настройках среды, на которые полагается solr? Что делать, если вам нужно создать файл среды "echo": /tmp/solr-env$$.dump; установить> /tmp/solr-env$$.dump "в сценарии запуска, а затем сравнить различные результирующие файлы среды? davidgo 10 лет назад 0
Я не уверен, что это делает, но при запуске его `файл окружения: /tmp/solr-env3188.dump; set` и при ручном запуске это `файл окружения: /tmp/solr-env3188.dump; set` shredding 10 лет назад 0
Ключ не в имени файла, а в его содержимом. Команда "set" показывает переменные среды, доступные для оболочки. Если вы сравните содержимое файла, вы сможете определить ключевую настройку, которая отличается в разных средах, и предположительно изменить что-то для компенсации. Число в конце файла не важно - это просто идентификатор процесса - я использовал его, чтобы вы получали разные имена файлов при каждом запуске. davidgo 10 лет назад 0

2 ответа на вопрос

0
davidgo

There are a few ways of resolving this problem, however they will, I suspect, all boil down to the same thing.

The "Crude/Bare metal" way of doing this - Have a look in /etc (ideally as root), and you will find a number of directories rcX.d as well as a directory "init.d".

If you look in one of the rcX.d directory you will see it is full of files which are symlinked to /etc/init.d/filename. The "S" at the beginning of the file means "start". The number which comes next indicates the order files should be run in.

When the OS initiates/changes runlevel, it runs all the file for that runlevel, ie for runlevel 2 it will run /etc/rc2.d/S* - If the file is not symlinked in it won't start when the runlevel starts. To check the current runlevel you can type "runlevel" which will return the currently running runlevel.

You are probably interested in runlevels 2-5 - you can find a list of the runlevels here

If you want to add a program to the appropriate runlevel you can simply create the appropriate symlink. The way I prefer to do it though is to install "chkconfig". I don't know if this is a version of the Redhat script (Syntax is not compatible, but very close) - but this command will allow you to view and change what programs work at runlevels.

chkconfig -l Will show all programs and their runlevels, and chkconfig -l progname will show runlevels enabled for a given program.

To make a program run for a particular runlevel (or multiple runlevels) you can use chkconfig progname Runlevels, eg chkconfig sshd 2345 will ensure sshd runs when you enter runlevel 2,3,4 or 5.

Как описано, я запускаю `sudo update-rc.d solr defaults`, и он создал все записи для меня. Я дважды проверил, есть записи типа `S20solr -> ../ init.d / solr` во всех каталогах уровня запуска. shredding 10 лет назад 0
0
mark

The problem is that at the time the init.d scripts are started, /vagrant/ is not available/mounted but you rely on it being there in your script.

See http://razius.com/articles/launching-services-after-vagrant-mount/ for some pointers.

Похожие вопросы