а что inittab отсутствует ?
Oleg а что происходит после запуска /sbin/init ?:confused:
Printable View
а что inittab отсутствует ?
Oleg а что происходит после запуска /sbin/init ?:confused:
Нет inittab, поскольку init здесь не простой, а золотой. :) Т.е. написан специально для роутера и делает, что ему нужно.
Обьясните, плиз, какая епическая сила толкает (должна толкать, потому как у меня сего не происходит) стартовые скрипты из /opt/etc/init.d ?
Туплю и понять не имею разумения...
Раньше, как я помню, в старом репозитории при установки ipkg ставился скрипт /opt/etc/rc.unslung, который толкал скрипты из папки /opt/etc/init.d, начинающиеся на S плюс две цифры (для приоритета). Но соответственно его нужно было также прописывать в пост-маунт. Теперь же с новым ipkg-opt этот скрипт не ставится.
Вот содержимое того самого скрипта.
Code:for i in /opt/etc/init.d/S??* ;do
# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
done
Да, конечно же я имел ввиду приоритет запуска.
С установкой большого количества сервисов появилась проблема управления их запуском и мониторинга состояния. К сожалению, система скриптов ПО из optware не отличается последовательностью и полнотой реализации (хотя у некоторых пакетов, безусловно, встречаются полноценные решения), поэтому пришлось дорабатывать её самому. Вот что пока получилось.
rc.unslung:
rc.func: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
S* (на примере asterisk):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##*/}."
Краткая справка, о том, как это работает и о способах применения.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. Подразумеваю, что они у всех есть, как на любом порядочном линуксе.
у меня во всех скриптах есть еще и info
а bash зачем?
Лучшая совместимость с моим кодом. :) А встроенный шелл source умеет? Я только что вынес все функции в отдельный файл, в большинстве S* только шапки остались.
+ добавил сортировку порядка запуска сервисов в зависимости от задачи. Нужны findutils.
+ добавил примитивную проверку (check)
сомневаюсь :)Quote:
Лучшая совместимость с моим кодом.
умеет. Кстати:Quote:
А встроенный шелл source умеет?
это тот же source.PHP Code:. $i $1
Встроенный /bin/sh не умеет разве что массивы, но у Вас их все равно нет.
Смысл универсализации с вынесением функций наружу сомнителен, т.к. у демонов могут быть свои потребности: например самба запускает 2 сервиса, а amuled должен прибивать еще и amuleweb
Стандартизация нужна на уровне способов запуска --- а они и так стандартные.
Можно и так. Просто документации по встроенному sh я не нашёл (подозреваю, что как и весь busybox, это нечто очень нестандартное и урезанное), а по bash - в изобилии. Если мне понадобится что-либо реализовать, принимать во внимание sh я точно не буду, я им даже не пользуюсь.
Насчёт служб с несколькими процессами я уже думаю, как реализовать. Это точно не проблема.
Для себя смысл в модуле я вижу в том, что мне проще обновлять код, и копипаста меньше выходит.
Кстати, нет ли удобного способа передать имя родительского скрипта в запускаемый? Нужно для разграничения между запуском, например, из post-firewall и post-mount.
У Олега sh не урезан. Строго говоря это ash. Я обычно пользую вот это описание:
http://www.freebsd.org/cgi/man.cgi?q...SE&format=html
Во первых есть $0Quote:
Кстати, нет ли удобного способа передать имя родительского скрипта в запускаемый? Нужно для разграничения между запуском, например, из post-firewall и post-mount.
Во вторых при использовании ps из procps
ps -AF возвращает в т.ч. PPID (т.е. parent's pid)
В третьих, что то в этом роде:
выведет название той проги из которой вызваноCode:awk '/Name/{print $2}' "/proc/`awk '/PPid/{print $2}' "/proc/$$/status"`/status"
P.S. Эх, красивую комманду я написал --- даже стирать обидно...
В четвертых, есть переменная окружения $PPID
Code:awk '/Name/{print $2}' "/proc/$PPID/status"
ну вообше да, #!/opt/bin/bash сразу не заметил, моветон это.