С установкой большого количества сервисов появилась проблема управления их запуском и мониторинга состояния. К сожалению, система скриптов ПО из optware не отличается последовательностью и полнотой реализации (хотя у некоторых пакетов, безусловно, встречаются полноценные решения), поэтому пришлось дорабатывать её самому. Вот что пока получилось.
rc.unslung:
PHP Code:
#!/bin/sh
# Start/stop all init scripts in /opt/etc/init.d including symlinks
# starting them in numerical order and
# stopping them in reverse numerical order
#logger "Started $0${*:+ $*}."
ACTION=$1
CALLER=$2
if [ $# -lt 1 ]; then
printf "Usage: $0 {start|stop|restart|reconfigure|check|kill}\n" >&2
exit 1
fi
[ $ACTION = stop -o $ACTION = restart -o $ACTION = kill ] && ORDER="-r"
for i in $(/opt/bin/find /opt/etc/init.d/ -perm '-u+x' -name 'S*' | sort $ORDER ) ;
do
case "$i" in
S* | *.sh )
# Source shell script for speed.
trap "" INT QUIT TSTP EXIT
#set $1
#echo "trying $i" >> /tmp/rc.log
. $i $ACTION $CALLER
;;
*)
# No sh extension, so fork subprocess.
$i $ACTION $CALLER
;;
esac
done
rc.func:
PHP Code:
#!/bin/sh
ACTION=$1
CALLER=$2
ansi_red="\033[1;31m";
ansi_white="\033[1;37m";
ansi_green="\033[1;32m";
ansi_yellow="\033[1;33m";
ansi_blue="\033[1;34m";
ansi_bell="\007";
ansi_blink="\033[5m";
ansi_std="\033[m";
ansi_rev="\033[7m";
ansi_ul="\033[4m";
start() {
[ "$CRITICAL" != "yes" -a "$CALLER" = "cron" ] && return 7
[ "$ENABLED" != "yes" ] && return 8
echo -e -n "Starting $DESC... "
if [ -n "`pidof $PROC`" ]; then
echo -e " $ansi_yellow already running. $ansi_white"
return 0
fi
$PRECMD > /dev/null 2>&1
$PREARGS $PROC $ARGS > /dev/null 2>&1 &
#echo $PREARGS $PROC $ARGS
COUNTER=0
LIMIT=10
while [ -z "`pidof $PROC`" -a "$COUNTER" -le "$LIMIT" ]; do
sleep 1s;
COUNTER=`expr $COUNTER + 1`
done
$POSTCMD > /dev/null 2>&1
if [ -z "`pidof $PROC`" ]; then
echo -e " $ansi_red failed. $ansi_white"
logger "Failed to start $DESC from $CALLER."
return 255
else
echo -e " $ansi_green done. $ansi_white"
logger "Started $DESC from $CALLER."
return 0
fi
}
stop() {
case "$ACTION" in
stop | restart)
echo -e -n "Shutting down $PROC... "
killall $PROC 2>/dev/null
COUNTER=0
LIMIT=10
while [ -n "`pidof $PROC`" -a "$COUNTER" -le "$LIMIT" ]; do
sleep 1s;
COUNTER=`expr $COUNTER + 1`
done
;;
kill)
echo -e -n "Killing $PROC... "
killall -9 $PROC 2>/dev/null
;;
esac
if [ -n "`pidof $PROC`" ]; then
echo -e " $ansi_red failed. $ansi_white"
return 255
else
echo -e " $ansi_green done. $ansi_white"
return 0
fi
}
check() {
echo -e -n "Checking $DESC... "
if [ -n "`pidof $PROC`" ]; then
echo -e " $ansi_green alive. $ansi_white";
return 0
else
echo -e " $ansi_red dead. $ansi_white";
return 1
fi
}
reconfigure() {
SIGNAL=SIGHUP
echo -e "Sending $SIGNAL to $PROC... "
killall -$SIGNAL $PROC 2>/dev/null
}
for PROC in $PROCS; do
case $ACTION in
start)
start
;;
stop | kill )
check && stop
;;
restart)
check > /dev/null && stop
start
;;
check)
check
;;
reconfigure)
reconfigure
;;
*)
echo -e "Usage: $0 (start|stop|restart|check|kill|reconfigure)"
exit 1
;;
esac
done
#logger "Leaving ${0##*/}."
S* (на примере asterisk):
PHP Code:
#!/bin/sh
ENABLED=yes
PROCS=asterisk
ARGS="-pFvvv"
PREARGS="nice -n -20"
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /opt/etc/init.d/rc.func
Краткая справка, о том, как это работает и о способах применения.
rc.unslung - основной управляющий скрипт, запускающий остальные скрипты с указанным параметром. Проверяет атрибут исполнения, для отключения скрипта достаточно сделать ему chmod -x.
Применение:
- инициализация сервисов после загрузки (предпочтителен запуск из post-mount)
- корректное завершение до перезагрузки (pre-shutdown)
- мониторинг запущенных сервисов по расписанию cron'a (подойдёт параметр start)
- реконфигурация выбранных служб при изменении сетевых настроек (post-firewall) (пока никак не реализовано)
- запуск по запросу
rc.func - скрипт-модуль, содержащий основные функции. Вызывается из S*.
Основные параметры:
- start - запуск, перед этим осуществляется проверка на наличие уже запущенного процесса
- stop - останов
- restart - перезагрузка сервиса. то же самое, что stop + start
- check - проверка на запущенность
S* - скрипты настроек сервисов.
Содержат переменные:
- ENABLED - флаг-выключатель
- PROC - имя исполняемого файла для запуска, оно же используется для проверок состояния и для завершения
- ARGS - аргументы процесса
- PREARGS - префикс в командной строке запуска. Например, им может быть nice или sudo с параметрами.
- PRECMD и POSTCMD - команды, выполнящиеся до и после запуска основного процесса. PRECMD вызывается модально.
- DESC - описание
- PATH - наиболее полный список путей
- CRITICAL - флаг обработки при запуске из cron'a
Такой вот черновик получился. Может, кому пригодится или общими силами допишем нечто всеобъемлющее.
*для запуска скриптов требуются findutils. Подразумеваю, что они у всех есть, как на любом порядочном линуксе.