Page 1 of 4 123 ... LastLast
Results 1 to 15 of 50

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

  1. #1

    Question ...а inittab где ?

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

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

  3. #3

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

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

  4. #4
    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

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

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

  7. #7

    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.

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

  9. #9
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    а bash зачем?

  10. #10
    Quote Originally Posted by al37919 View Post
    а bash зачем?
    Лучшая совместимость с моим кодом. А встроенный шелл source умеет? Я только что вынес все функции в отдельный файл, в большинстве S* только шапки остались.


    + добавил сортировку порядка запуска сервисов в зависимости от задачи. Нужны findutils.
    + добавил примитивную проверку (check)
    Last edited by djet; 27-02-2008 at 11:57.

  11. #11
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    Лучшая совместимость с моим кодом.
    сомневаюсь
    А встроенный шелл source умеет?
    умеет. Кстати:
    PHP Code:
    $i $
    это тот же source.

    Встроенный /bin/sh не умеет разве что массивы, но у Вас их все равно нет.

    Смысл универсализации с вынесением функций наружу сомнителен, т.к. у демонов могут быть свои потребности: например самба запускает 2 сервиса, а amuled должен прибивать еще и amuleweb

    Стандартизация нужна на уровне способов запуска --- а они и так стандартные.
    Last edited by al37919; 27-02-2008 at 13:01.

  12. #12
    Quote Originally Posted by al37919 View Post
    сомневаюсь

    умеет. Кстати:
    PHP Code:
    $i $
    это тот же source.

    Встроенный /bin/sh не умеет разве что массивы, но у Вас их все равно нет.

    Смысл универсализации с вынесением функций наружу сомнителен, т.к. у демонов могут быть свои потребности: например самба запускает 2 сервиса, а amuled должен прибивать еще и amuleweb

    Стандартизация нужна на уровне способов запуска --- а они и так стандартные.
    Можно и так. Просто документации по встроенному sh я не нашёл (подозреваю, что как и весь busybox, это нечто очень нестандартное и урезанное), а по bash - в изобилии. Если мне понадобится что-либо реализовать, принимать во внимание sh я точно не буду, я им даже не пользуюсь.

    Насчёт служб с несколькими процессами я уже думаю, как реализовать. Это точно не проблема.

    Для себя смысл в модуле я вижу в том, что мне проще обновлять код, и копипаста меньше выходит.

    Кстати, нет ли удобного способа передать имя родительского скрипта в запускаемый? Нужно для разграничения между запуском, например, из post-firewall и post-mount.

  13. #13
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    У Олега sh не урезан. Строго говоря это ash. Я обычно пользую вот это описание:
    http://www.freebsd.org/cgi/man.cgi?q...SE&format=html


    Кстати, нет ли удобного способа передать имя родительского скрипта в запускаемый? Нужно для разграничения между запуском, например, из post-firewall и post-mount.
    Во первых есть $0
    Во вторых при использовании 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"
    Last edited by al37919; 27-02-2008 at 14:02.

  14. #14
    ну вообше да, #!/opt/bin/bash сразу не заметил, моветон это.
    vim имеет два режима - бибикать и все портить (с) не мое

  15. #15
    Quote Originally Posted by angel_il View Post
    ну вообше да, #!/opt/bin/bash сразу не заметил, моветон это.
    О вкусах не спорят, у вас другой шелл? И скрипты у меня всё равно ни фига не кросс-платформенные.

Page 1 of 4 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
  •