Page 1 of 3 123 LastLast
Results 1 to 15 of 50

Thread: Шаблон скриптов инициализации init.d

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1

    Question ...а inittab где ?

    а что inittab отсутствует ?
    Oleg а что происходит после запуска /sbin/init ?

  2. #2
    Join Date
    Dec 2003
    Location
    Russian Federation
    Posts
    8,356
    Нет inittab, поскольку init здесь не простой, а золотой. Т.е. написан специально для роутера и делает, что ему нужно.

  3. Question

    Quote Originally Posted by Oleg View Post
    Нет inittab, поскольку init здесь не простой, а золотой. Т.е. написан специально для роутера и делает, что ему нужно.
    понимаю, что тема стара, но где можно почитать о процессе запуска роутера? Что конкретно init делает при загрузке?
    спасибо.

  4. #4
    Quote Originally Posted by mc-sim View Post
    понимаю, что тема стара, но где можно почитать о процессе запуска роутера? Что конкретно init делает при загрузке?
    спасибо.
    Исходники )
    Sorry for my bad English.
    Покупайте Отечественных Слонов!!!

  5. Quote Originally Posted by FilimoniC View Post
    Исходники )
    К сожалению, в "С" не силен
    А вообще если чисто академический интерес, то исходники. Если нужно решение конкретной задачи, то опиши может есть решение не залезая в подноготную
    Собственно, вопрос более академический, нежели связан с какой-то проблемой... Хочется понять процесс загрузки пошагово... В обычном линухе, там все можно разобрать по косточкам, начиная с /etc/inittab, а тут бы хотелось понять что да как...
    А вы с какой целью интересуетесь? Может вам стоит почитать про post-boot, post-firewall и т.п.?
    про них уже читал
    вот тут хотошо написано http://wiki.vectormm.net/index.php/К...льские_скрипты

  6. например согласно инструкции: http://wl500g.info/showthread.php?t=3171
    чтобы работал SSH сервер dropbear, его необходимо прописать его в /usr/local/sbin/post-boot, но по умолчанию, в прошивке 1.9.2.7-rtn-r2274 на RT-N16 нет данного файла, но SSH тем не менее настраивается через веб морду и работает. Вот и интересно, кто и как и по каким конфигам его запускает...

  7. #7
    Quote Originally Posted by mc-sim View Post
    К сожалению, в "С" не силен
    Собственно, вопрос более академический, нежели связан с какой-то проблемой... Хочется понять процесс загрузки пошагово... В обычном линухе, там все можно разобрать по косточкам, начиная с /etc/inittab, а тут бы хотелось понять что да как...
    Исходники прошивки не всегда в "С"... Прошивка это совокупность всего, что в нее включено (скомпилированный исходник кода, включенные файлы конфигураций, etc ...) Попробуй скачать скачать и посмотреть ... скрипты они и в Африке скрипты ... Может поможет ...
    З.Ы. Хотя, не зная основ, зачем академический интерес ???

  8. #8
    Quote Originally Posted by mc-sim View Post
    понимаю, что тема стара, но где можно почитать о процессе запуска роутера? Что конкретно init делает при загрузке?
    спасибо.
    Самый простой способ понять что происходит при загрузке это скачать исходники прошивки и изучить их ... Блин FilimoniC уже сказал...
    А вообще если чисто академический интерес, то исходники. Если нужно решение конкретной задачи, то опиши может есть решение не залезая в подноготную

  9. #9
    Quote Originally Posted by mc-sim View Post
    Что конкретно init делает при загрузке?
    А вы с какой целью интересуетесь? Может вам стоит почитать про post-boot, post-firewall и т.п.?
    ASUS RT-N16 1.9.2.7-rtn, Zotac ZBOX (rtorrent@Ubuntu 13.10)

  10. #10

    Тупой вопрос: init.d

    Обьясните, плиз, какая епическая сила толкает (должна толкать, потому как у меня сего не происходит) стартовые скрипты из /opt/etc/init.d ?
    Туплю и понять не имею разумения...

  11. #11
    Join Date
    Aug 2006
    Location
    Moscow, Russia
    Posts
    788
    Раньше, как я помню, в старом репозитории при установки 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

  12. #12
    Quote Originally Posted by Mam(O)n View Post
    S плюс две цифры (для приоритета)
    Не приоритета, а очередности запуска ...

  13. #13
    Join Date
    Aug 2006
    Location
    Moscow, Russia
    Posts
    788
    Да, конечно же я имел ввиду приоритет запуска.

  14. #14

    Lightbulb Шаблон скриптов инициализации init.d

    С установкой большого количества сервисов появилась проблема управления их запуском и мониторинга состояния. К сожалению, система скриптов ПО из 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 
    "$iin
            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" -"$CALLER"cron" ] && return 7
            
    "$ENABLED!= "yes" ] && return 8
        
    echo --"Starting $DESC... "
        
    if [ -"`pidof $PROC`" ]; then
            
    echo -"            $ansi_yellow already running. $ansi_white"
            
    return 0
        fi
        $PRECMD 
    > /dev/null 2>&
        $PREARGS $PROC $ARGS 
    > /dev/null 2>&&
        
    #echo $PREARGS $PROC $ARGS
        
    COUNTER=0
        LIMIT
    =10
        
    while [ -"`pidof $PROC`" -"$COUNTER-le "$LIMIT]; do
            
    sleep 1s
            
    COUNTER=`expr $COUNTER + 1`
        
    done
        $POSTCMD 
    > /dev/null 2>&

        
    if [ -"`pidof $PROC`" ]; then
            
    echo -"            $ansi_red failed. $ansi_white"
            
    logger "Failed to start $DESC from $CALLER."
            
    return 255
        
    else
            echo -
    "            $ansi_green done. $ansi_white"
            
    logger "Started $DESC from $CALLER."
            
    return 0
        fi

    }

    stop() {
        case 
    "$ACTIONin
            stop 
    restart)
                echo -
    -"Shutting down $PROC... "
                
    killall $PROC 2>/dev/null
                COUNTER
    =0
                LIMIT
    =10
                
    while [ -"`pidof $PROC`" -"$COUNTER-le "$LIMIT]; do
                    
    sleep 1s
                    
    COUNTER=`expr $COUNTER + 1`
                
    done
                
    ;;
            
    kill)
                echo -
    -"Killing $PROC... "
                
    killall -9 $PROC 2>/dev/null
                
    ;;
        
    esac
        

        
    if [ -"`pidof $PROC`" ]; then
            
    echo -"            $ansi_red failed. $ansi_white"
            
    return 255
        
    else
            echo -
    "            $ansi_green done. $ansi_white"
            
    return 0
        fi
    }

    check() {
        echo -
    -"Checking $DESC... "
        
    if [ -"`pidof $PROC`" ]; then
            
    echo -"            $ansi_green alive. $ansi_white";
            return 
    0
        
    else 
            echo -
    "            $ansi_red dead. $ansi_white";
            return 
    1
        fi

    }

    reconfigure() {
        
    SIGNAL=SIGHUP
        
    echo -"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 -
    "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. Подразумеваю, что они у всех есть, как на любом порядочном линуксе.
    Last edited by djet; 16-12-2008 at 19:21.

  15. #15
    у меня во всех скриптах есть еще и info
    vim имеет два режима - бибикать и все портить (с) не мое

Page 1 of 3 123 LastLast

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •