Назад | Перейти на главную страницу

init.d не выполняет команду остановки при перезагрузке

У меня есть сценарий init.d для запуска сценария Python:

#!/bin/sh
#
###############################################################################
# sd-agent
#
# Written by Boxed Ice <customer.service@boxedice.com>
# A server monitoring daemon for www.serverdensity.com
#
# Licensed under Simplified BSD License (see LICENSE)
#
###############################################################################
#
# chkconfig: 345 85 15
# description: Server Density Monitoring Agent

AGENTPATH="/usr/bin/sd-agent/agent.py"

[ -f $AGENTPATH ] || echo "/usr/bin/sd-agent not found"

# Source function library.
if [ -f /etc/init.d/functions ]; then
        . /etc/init.d/functions
fi

if [ -f /etc/SuSE-release ]; then
        . /etc/rc.status
        rc_reset
fi

# Action to take
case "$1" in
  start)
        python $AGENTPATH start
        if [ -f /etc/SuSE-release ]; then
                rc_status -v
        elif [ -f /etc/debian_version ] || [ -f /etc/lsb-release ] || [ -f /etc/gentoo-release ]; then
                echo " Started"
        else
                success
                echo
        fi
        echo
    ;;
  stop)
        python $AGENTPATH stop

        if [ -f /etc/SuSE-release ]; then
                rc_status -v
        elif [ -f /etc/debian_version ] || [ -f /etc/lsb-release ] || [ -f /etc/gentoo-release ]; then
                echo " Stopped"
        else
                success
                echo
        fi
        echo
    ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: /etc/init.d/sd-agent start|stop|restart"
        exit 1
esac

exit 0

Это было "установлено" в chkconfig:

[root@test ~]# chkconfig --list sd-agent
sd-agent        0:off   1:off   2:off   3:on    4:on    5:on    6:off

Если я выполню:

service sd-agent start

Затем сценарий выполняется, как ожидалось. Код Python создает файл PID в /tmp/sd-agent.pid, как и положено. Точно так же, если я выполню

service sd-agent stop

затем сценарий завершается и файл PID удаляется.

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

Однако, если я запускаю сценарий, а затем перезагружаю сервер, команда остановки, похоже, не выполняется, потому что, когда сервер возвращается в исходное состояние, старый файл /tmp/sd-agent.pid все еще существует. Это препятствует выполнению команды запуска, поскольку она проверяет наличие файла PID и не запускается, если он уже существует.

Кажется, что команда остановки не выполняется, когда я запускаю команду перезагрузки, хотя ее вызов напрямую работает нормально.

Любые предложения относительно того, почему?

Это на CentOS 5.2.

Возможно, служба запускается правильно, но не останавливается должным образом.

Обзор http://www.serverde density.com/docs/agent/linuxstartup/ и убедитесь, что у вас есть K скриптов, а также S скриптов; возможно, вам придется запустить следующее (скопировано с указанной выше страницы):

ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc0.d/K15sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc1.d/K15sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc2.d/K15sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc3.d/S85sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc4.d/S85sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc5.d/S85sd-agent 
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc6.d/K15sd-agent

Обычно файл PID обрабатывается самим сценарием инициализации. Если это скрипт python, который очищает его, вы также должны включить этот код ...

Вы уверены, что это старый файл pid, а не вновь созданный, и что демон просто дает сбой при загрузке? / tmp рекомендуется очищать во время загрузки в соответствии со Стандартом иерархии файловой системы, см. этот раздел этого документа - не уверен, происходит ли это в CentOS или нет, но я так думал.

Обновить: tmpwatch вызывается cron (ежедневно) и периодически очищает / tmp в зависимости от времени (по умолчанию), поэтому на самом деле вы должны поместить их в / var / run, иначе они могут быть удалены из-под вас.

Итак, я бы начал с перемещения файла pid в / var / run и поставил задачу по его очистке в сценарии инициализации, а затем пошел бы оттуда.