У меня есть сценарий 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 и поставил задачу по его очистке в сценарии инициализации, а затем пошел бы оттуда.