Вопрос по поводу /opt/etc/init.d/rc.unslung

Используем пакеты, расширяющие возможности оборудования
nick7inc
Сообщения: 12
Зарегистрирован: 08 май 2017, 14:59

Сообщение nick7inc » 18 дек 2017, 21:13

Добрый вечер. Роутер Asus 56b1, прошивка Padavan.

Скажите, это нормально, что скрипт в /opt/etc/init.d/rc.unslung (сделал маленький примерчик для запуска из консоли):

Код: Выделить всё

for i in $(/opt/bin/find /opt/etc/init.d/ -perm '-u+x' -name 'S*' | sort "-r" ) ;
        do
            case "$i" in
                S* | *.sh  )
                    # Source shell script for speed.
                    echo "." $i $ACTION $CALLER
                    ;;
                *)
                    # No sh extension, so fork subprocess.
                    echo "-" $i $ACTION $CALLER
                    ;;
            esac
        done
работает вот так:

Код: Выделить всё

- /opt/etc/init.d/S80lighttpd
- /opt/etc/init.d/S23proxy
- /opt/etc/init.d/S10iptables
- /opt/etc/init.d/S09dnscrypt-proxy
- /opt/etc/init.d/S01system
Что-то мне казалось, что (по-идее) должен вызываться 1й case для S* дабы службы не параллельно вызывались, а ждали окончания запуска/остановки предыдущей....
P.S. Хочу в S01system добавить код, который останавливает все T* (службы ручного запуска, но сделать их с автоматической остановкой), но смутила работа скрипта. Разъясните, пожалуйста

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1455
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 19 дек 2017, 00:12

nick7inc писал(а):Источник цитаты Что-то мне казалось, что (по-идее) должен вызываться 1й case для S* дабы службы не параллельно вызывались

Ждем автора скрипта.

kaztost
Сообщения: 110
Зарегистрирован: 16 июл 2017, 23:29

Сообщение kaztost » 19 дек 2017, 09:34

nick7inc писал(а):Источник цитаты Что-то мне казалось, что (по-идее) должен вызываться 1й case для S*

Вот поскольку мне тоже постоянно кажется в init.d-процедуре то, что на самом деле неверно, не люблю я этот init.d.

nick7inc писал(а):Источник цитаты sort "-r"

Как бы намекает, но может разные сборки find по разному ищут. И почему не просто

Код: Выделить всё

for i in /opt/etc/init.d/S*;
do
 case "$i" in
 ...
 esac
done

?

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1455
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 19 дек 2017, 10:30

kaztost писал(а):Источник цитаты но может разные сборки find по разному ищут

В посте топикстартера это описано немного по албански и смущает. В родных скриптах используется или `sort` или `sort -r`. Первый вариант при инициализации, второй при стопе. Вопрос о case (в переводе с албанского).

kaztost
Сообщения: 110
Зарегистрирован: 16 июл 2017, 23:29

Сообщение kaztost » 19 дек 2017, 10:50

Zyxmon писал(а):Источник цитаты В родных скриптах используется или `sort` или `sort -r`. Первый вариант при инициализации, второй при стопе.

Ага вижу:

Код: Выделить всё

[ $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   ) ;                                                                                                                                                      


Про find был не прав - от него ничего не должно зависеть, а sort и в Африке sort.

kaztost
Сообщения: 110
Зарегистрирован: 16 июл 2017, 23:29

Сообщение kaztost » 19 дек 2017, 10:58

nick7inc писал(а):Источник цитаты P.S. Хочу в S01system добавить код, который останавливает все T*

Так добавьте код выше for-а:

Код: Выделить всё

if [ $ACTION = stop ] 
then
 #код
fi

Или в скрипте который вызывает /opt/etc/init.d/rc.unslung stop

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1455
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 19 дек 2017, 14:06

Действительно в скрипте ошибка. Переменная $i это полный путь, поэтому под маску S* и не попадает.

nick7inc
Сообщения: 12
Зарегистрирован: 08 май 2017, 14:59

Сообщение nick7inc » 19 дек 2017, 22:44

Zyxmon писал(а):Источник цитаты Переменная $i это полный путь

Именно это я в примере и показал. Я плохо разбираюсь в юниксах и скриптах, поэтому у меня есть вопрос. Может ли find в одной реализации системы возвращать полный путь, а в другой - только имена файлов? Если всегда возвращается только полный путь, то можно поправить скрипт:

Код: Выделить всё

for i in $(/opt/bin/find /opt/etc/init.d/ -perm '-u+x' -name 'S*' | sort $ORDER ) ;
do
	/opt/etc/init.d/S* | *.sh )


Зачем я всё это затеял. Я пишу свои скрипты и ставлю их в S01system . Время от времени я замечаю, что что-то неладно: то флешка не извлекается, то служба не запускается, то последний скрипт, который переносит системный лог на флешку не может удалить ссылку (case: stop), если запускается из S01system:

Код: Выделить всё

#!/bin/sh

CHECKPATH="/media/Main"
RAMLOGPATH="/tmp/syslog.log"
DISKLOGPATH="/media/Main/opt/tmp/syslog.txt"
LMSGNAME="syslog_to_disk.sh"

## From opt-mount.sh: check /opt already mounted
if ! mountpoint -q $CHECKPATH ; then
 echo $CHECKPATH "NOT exist!" && exit 1
else
 echo "Disk:'" $CHECKPATH "' exist! Performing action '"$1"' for syslog."
fi

case "$1" in
    start)
#Checks if /tmp/syslog.log is already link (prevent overcycling)
        if [ -L $RAMLOGPATH ] ; then
            echo $RAMLOGPATH"is a symbolic link"
        else
            cat $RAMLOGPATH >> $DISKLOGPATH
            ln -sf $DISKLOGPATH $RAMLOGPATH
        fi
        ;;

    stop)
        logger -t "$LMSGNAME" "Removing logfile from disk"
        rm -f $RAMLOGPATH
        if [ !  $RAMLOGPATH ] ; then
         touch $RAMLOGPATH
         logger -t "$LMSGNAME" "Symlink removed"
        else
          logger -t "$LMSGNAME" "Symlink NOT removed"
        fi
        ;;
    *)
        ;;
    esac      


Насколько я понял, при stop S01system должен отрабатывать последним. Значит что-то параллелится. Если в rc.unslung срабатывал бы 1й кейс, то параллелиться ничего не должно, т.к. точка в начале скрипта (насколько я понял) эквивалентна ключевом слову source, что приостанавливает основной скрипт при вызове того, что за source.
Последний раз редактировалось nick7inc 19 дек 2017, 23:07, всего редактировалось 4 раза.

nick7inc
Сообщения: 12
Зарегистрирован: 08 май 2017, 14:59

Сообщение nick7inc » 19 дек 2017, 22:53

Хотя я всё равно не врубаюсь в скрипт rc.unslung с case: там же в find ищутся файлы, которые начинаются на S, то зачем ещё раз проверять начало на S в case? Ещё и логическое "или" ставить, проверяя *.sh расширение. Что код делать-то должен по сути?
Всё, понял, здесь должны вызываться все файлы без расширения или с расширением *.sh, поэтому и проверяется.

Что должно запускаться с точкой (аналог source) в начале без параллеливания, а что - без точки (то бишь с параллельным выполнением)?, если ищутся для запуска только файлы, начинающиеся на S ?

Раз все файлы автозапуска S* стоят с номерами, то и запускаться и останавливаться они должны с ожиданием выполнения предыдущей операции. На мой взгляд, это сделано, чтобы устранить проблемы с зависимости одной службы от другой. Тогда скрип rc.unslung надо исправлять, т.к. он не работает ожидаемым (логичным) образом и запускает/останавливает всё параллельно, делая возможным сбой запуска/останова службы при наличии зависимостей.
Последний раз редактировалось nick7inc 20 дек 2017, 10:48, всего редактировалось 2 раза.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1455
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 19 дек 2017, 23:24

Все работает правильно, но вместо source вызывается fork. Если автор скрипта появится, он, возможно, все объяснит.
Но Вы вольны заменить этот скрипт на свой, правильный.


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 0 посетителей :: 0 зарегистрированных, 0 скрытых и 0 гостей (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей