# Тихий выход из init-скрипта /etc/init.d/blabla

## gtlinuxman

Допустим, при старте скрипта выполняется проверка на условие (существование файла, к примеру).

Как по тихому выйти из скрипта, если условие не выполняется?

"По тихому", значит без сообщений об ошибке, и без занесения скрипта в список "started".

----------

## Roger Enrasson

а можно скрипт посмотреть?

----------

## gtlinuxman

Ну, в общем, в данный момент он выглядит примерно так:

```
#!/sbin/runscript

depend() {

        use net

        after logger

}

check() {

if [ -z "$MYFILE" ] ; then

        eerror "You need to setup  MYFILE in /etc/conf.d/blabla first"

        return 1

fi

if [ ! -e $MYFILE ] ; then

        return 1

fi

}

start() {

        check || return 1

        ebegin "Starting my-service"

        start-stop-daemon --start --quiet --exec /usr/sbin/my-programm

        eend $?

}

stop() {

        ebegin "Stopping my-service"

        start-stop-daemon --stop --quiet --exec /usr/sbin/my-programm

        eend $?

}
```

В упрощенном виде, - так:

```
#!/sbin/runscript

depend() {

        use net

        after logger

}

start() {

        ebegin "Starting my-service"

        if [ -e $MYFILE ] ; then

        start-stop-daemon --start --quiet --exec /usr/sbin/my-programm

        fi

        eend $?

}

stop() {

        ebegin "Stopping my-service"

        start-stop-daemon --stop --quiet --exec /usr/sbin/my-programm

        eend $?

}
```

Если, в первом случае, выдается ошибка старта, то во втором скрипт вносится в список "started".

----------

## ArtSh

попробуйте 

```

start() {

        ebegin "Starting my-service"

        if [ -e $MYFILE ] ; then

        start-stop-daemon --start --quiet --exec /usr/sbin/my-programm

        eend $?

        fi

        eend 1 "file not found"

} 

```

Вобщем самое важное -- eend 1

----------

## gtlinuxman

 *ArtSh wrote:*   

> Вобщем самое важное -- eend 1

 

Попробовал, даёт "ERROR: ... failed to start"

Можно было бы, запускать этот скрипт из другого, после проверки условия, но это слишком сложно, нужно провернуть как можно проще.

----------

## ova

 *gtlinuxman wrote:*   

> Допустим, при старте скрипта выполняется проверка на условие (существование файла, к примеру).
> 
> Как по тихому выйти из скрипта, если условие не выполняется?
> 
> "По тихому", значит без сообщений об ошибке, и без занесения скрипта в список "started".

 

Честно говоря я не очень понимаю в чём смысл. Зачем так надо?

Если пользователь добавил нечно на runlevel, значит пользователь хочет чтобы оно стартовало.

А так. Вам просто нужно выйти из скрипта вернув 1. Что-то типа

```

checkconfig() {

        [ -f /etc/config ] || return 1

}

start() {

        checkconfig ||  return 1

}

```

Или другими словами уберите в вашем скрипте eerror и скрипт не будет писать ошибок  :Smile: 

----------

## Galchonok

а в /etc/conf.d/local,start

 ваш скрипт прописать (вписать) ?

 и все ... тихо мирно все запустится и отработает :]

собственно local.start для такого как я понимаю и сделан :]

----------

## gtlinuxman

 *Volkov_Peter wrote:*   

> 
> 
> Если пользователь добавил нечно на runlevel, значит пользователь хочет чтобы оно стартовало.
> 
> 

 

Надо, чтобы оно стартовало ТОЛЬКО при определённом условии, а если условие не выполнилось, то тихо убраться с глаз долой,  не выдёргивая юзера из gensplash, к примеру.

 *Volkov_Peter wrote:*   

> 
> 
> Или другими словами уберите в вашем скрипте eerror и скрипт не будет писать ошибок 

 

неее, ошибка всё равно будет, о провале старта  :Smile: 

Galchonok, на данный момент так оно и есть  :Smile: 

Хорошо, вот взгляните зачем это надо.

Один Друг надумал Приёмы работы с UDEV

----------

## ova

 *gtlinuxman wrote:*   

> 
> 
> неее, ошибка всё равно будет, о провале старта 
> 
> 

 

 :Question:  В какой момент?

Вот скрипт:

```

*chroot* ~ $ cat /etc/init.d/foo

#!/sbin/runscript

# Copyright 1999-2006 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2

# $Header: $

chkconfig() {

        [ -f /etc/file_not_exist ] || return 1

}

start() {

        chkconfig || return 1

        return 0

}

stop() {

        :

}

```

А вот я его запускаю:

```

*chroot* ~ $ /etc/init.d/foo start

*chroot* ~ $ /etc/init.d/foo start

*chroot* ~ $

```

Никаких сообщений об ошибках...

----------

## gtlinuxman

 *Volkov_Peter wrote:*   

> Никаких сообщений об ошибках...

 

```
# /etc/init.d/foo start

 * Service foo starting

 * ERROR:  foo failed to start

```

ы у Вас другой Gentoo? В /etc/confd.d/rc RC_VERBOSE="no"  :Sad: 

----------

## ova

 *gtlinuxman wrote:*   

> 
> 
> ```
> # /etc/init.d/foo start
> 
> ...

 

Посмотрите сорцы. Отличие у нас с вами в том, что у вас стоит RC_PARALLEL="yes" а у меня "no".

Но есть возможность добавить RC_QUIET="yes" в /etc/conf.d/rc. Тогда сообщения тоже не будет. Но эта опция не документирована, может иметь побочные эффекты (смотрите сорцы   :Wink:  ) и возможно будет в убрана в следующей версии. Я уточню...

Между прочим из командной строки можно делать так:

```
# /etc/init.d/foo --quiet start

 * Service foo starting

```

----------

## ova

И вот ответ от uberlord'а разработчика baselayout:

 *Quote:*   

> 
> 
> Service messages are always printed. It's a side effect of parallel startup.
> 
> The good news is that baselayout-1.13 has this fixed by buffering e* output.
> ...

 

Так что думаю всё ясно    :Very Happy: 

----------

## gtlinuxman

 *Volkov_Peter wrote:*   

> Так что думаю всё ясно   

 

Да, теперь ясно. Большое спасибо, Volkov_Peter, передайте мою благодарность uberlord'у  :Smile: 

Думаю, что в таких случаях, дополнительный скрипт проверки (в local.start, или отдельный) в данный момент остается лучшим выходом.

----------

