Создание альтернативного запуска sphinx. Сценарий инициализации sphinx. Debian 7

27.10.2015

Эта запись является заметкой для других (начальных) статей по поисковой машине sphinx.

Зачем нужно создавать свой скрипт инициализации sphinx если он уже есть в системе? 

Если мы хотим запускать shpinx автоматически при старте системы, да еще и со своими настройками (например со своим конфигурационным файлом, отличным от дефолтного) и прочими параметрами, значит быстрее всего можно будет этого добиться создав свой daemon для sphinx (скрипт инициализации). А так же на мой взгляд важным является и то, что при таком подходе можно запускать sphinx для нескольких сайтов на одном сервере!

Скрипты авто запуска программ в Debian как в windows папка "Автозагрузка" лежат в /etc/init.d/ (есть несколько вариантов автозагрузки в Debian 7 и описанный выше, это один из них и как на мой взгляд "правильный")

Если посмотреть в эту папку, то можно обнаружить и другие скрипты инициализации, например apache2, nginx и др. Все что нам нужно, добавить в эту папку наш демон запуска сфинкса.

Создаем копию какого-нибудь демона (любого), в эту папку и переименовываем его, например sphinx-site1. В результате получим:

/etc/init.d/sphinx-site1

Открываем файл sphinx-site1 и очищаем его, после чего вставляем следующее:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          sphinx-site1
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Run/Stop sphinx-site1
### END INIT INFO

# Author: Matthew P <support@bar-data.com>
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Sphinx site1.ru"
NAME=sphinx-site1
DAEMON=/usr/bin/searchd
DAEMON_ARGS="--config /home/site1/web/site1.ru/sphinx/sphinx.conf"
PIDFILE=/home/site1/web/site1.ru/sphinx/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
    . /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
   start-stop-daemon --start --quiet --pidfile $PIDFILE -b -m --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
   # Add code here, if necessary, that waits for the process to be ready
   # to handle requests from services started subsequently which depend
   # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
   RETVAL="$?"
   [ "$RETVAL" = 2 ] && return 2
   # Wait for children to finish too if this is a daemon that forks
   # and if the daemon is only ever run from this initscript.
   # If the above conditions are not satisfied then add some other code
   # that waits for the process to drop all resources that could be
   # needed by services started subsequently.  A last resort is to
   # sleep for some time.
   start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
   # Many daemons don't delete their pidfiles when they exit.
   rm -f $PIDFILE
   return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
   return 0
}

case "$1" in
  start)
   [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
   do_start
   case "$?" in
      0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
      2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
   esac
    ;;
  stop)
   [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
   do_stop
   case "$?" in
      0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
      2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
   esac
    ;;
  status)
   status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
   ;;
  #reload|force-reload)
   #
   # If do_reload() is not implemented then leave this commented out
   # and leave 'force-reload' as an alias for 'restart'.
   #
   #log_daemon_msg "Reloading $DESC" "$NAME"
   #do_reload
   #log_end_msg $?
   #;;
  restart|force-reload)
   #
   # If the "reload" option is implemented then remove the
   # 'force-reload' alias
   #
   log_daemon_msg "Restarting $DESC" "$NAME"
   do_stop
   case "$?" in
     0|1)
      do_start
      case "$?" in
         0) log_end_msg 0 ;;
         1) log_end_msg 1 ;; # Old process is still running
         *) log_end_msg 1 ;; # Failed to start
      esac
        ;;
     *)
      # Failed to stop
      log_end_msg 1
;;
   esac
    ;;
  *)
   #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
   echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
   exit 3
;;
esac

:

Создаем свою папку для sphinx:

Удобнее всего создавать ее в каталоге пользователя/сайта для которого создается демон sphinx. Например:

/home/site1/web/site1.ru/sphinx/sphinx.conf - где sphinx созданная папка и sphinx.conf (созданный файл концигурации)

Все что нужно отредактировать это:

DESC="Sphinx site1.ru" - Описание скрипта инициализации (пишем что угодно, в чем потом разберетесь)
NAME=sphinx-site1  - имя скрипта инициализации (чтобы не путаться, напишем такое же как и название файла текущего скрипта)
DAEMON_ARGS="--config /home/site1/web/site1.ru/sphinx/sphinx.conf" - аргументы запуска демона sphinx. Измените путь к конфигурационному файлу (/home/site1/web/site1.ru/sphinx/sphinx.conf) на свой!!!
PIDFILE=/home/site1/web/site1.ru/sphinx/$NAME.pid  - меняем путь к папке sphinx на свой!

 

Вот и все! Осталось настроить файл конфигурации в папке /home/site1/web/site1.ru/sphinx/sphinx.conf 

И пользоваться созданным скриптом:

service sphinx-site1 start #запуск

service sphinx-site1 stop #остановить

service sphinx-site1 restart #перезапуcтить

 

Рекомендую в sphinx.conf при описании индексов указывать путь логов и хранения в /home/site1/web/site1.ru/sphinx/log и /home/site1/web/site1.ru/sphinx/data соответственно (не забудьте создать папки data и log). 

 

Так же можно поставить на cron задание для обновления индексов:

indexer --config /home/site1/web/site1/sphinx/sphinx.conf.in --all --rotate

 

ВАЖНО! Чтобы добавить наш сервис в автозагрузку выполняем:

 update-rc.d sphinx-site1 defaults

Таким образом при старте системы, будет запускаться sphinx демон для сайта автоматически.

comments powered by HyperComments