LINUX.ORG.RU

Получить exit status из циклического скрипта. Ну или его симуляцию


0

0

Есть упрощенный скрипт /usr/sbin/test
#!/bin/sh
while (true); do sleep 12
echo «Script Run»
done

Он запускается по всем правилам демона, из файла /etc/rc.d/init.d/test
........... Файл запуска (фрагмент)...............
start() {
# Check if test is already running
if [ ! -f /var/lock/subsys/test ]; then
echo -n $«Starting $prog: »
daemon /usr/sbin/test
RETVAL=0
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/test
echo
fi
return $RETVAL
}
.................................................
Прототипом для творчества был /etc/rc.d/init.d/atd если кому интересно..

Так вот вопрос: как вернуть exit status = 0 из /usr/sbin/test в скрипт которй его запустил, в /etc/rc.d/init.d/test. Потому, что иначе при команде service test start не будет индикации вида:

Starting test [ OK ]

Я пробовал заменить верхний циклический скрипт, таким же написанным на С, - все работает. На bash/sh нет возврата exit statusa т.к. он все еще работает в цикле. Как его нарисовать этот exit status?

(CentOS 5.5)


Запустите подпроцесс, закройте его файловые дескрипторы stdin, stdout, stderr, откройте их на /dev/null, завершите родительский процесс с кодом 0.

AITap ★★★★★
()

Если я правильно понял, то тебе нужен /bin/true.

% /bin/true && echo OK || echo fail
OK
% /bin/false && echo OK || echo fail
fail

l5k
()

Что за фигня? Зачем там скобки?

while (true);

Если уж bash, то «while :»

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

То есть примерно так:

#!/bin/bash
( while : ; do
    sleep 10 
 done ) & 

exit 15 # Любое желаемое число

Понятно, что перенаправить stdin и т.д., cd на корень. И оформить функцией и вызвать её из subshell'а.

mky ★★★★★
()
Ответ на: комментарий от mky

Решено! Спасибо rooty (mky) под зонтиком!

Не мог долго ответить, так как возил половинку на море
Сделал так:
#!/bin/bash
( while : ; do
sleep 20
wall «Script run...»
done ) &
exit 0
Да, теперь этот скрипт демонизируется, дает exit status = 0

service test start [OK]
service test restart [OK]
service test stop [OK]
service test status
test (pid 3303) выполняется....

Вызываю я его точно также как идет вызов другой программы из
/etc/rc.d/init.d/atd с небольшими косметическими изменениями

Теперь я могу писать демоны :) Всем огромное спасибо!

dromer
() автор топика
Ответ на: Решено! Спасибо rooty (mky) под зонтиком! от dromer

Только оформляйте своих демонов нормально, с перенаправлением ввода/вывода и в отдельной функции (функциях), чтобы не было «простыни» команд в круглых скобках, как то так:

#!/bin/bash

demon_main() {
  while : ; do
     sleep 20
     wall "Script run..."
  done
}

cd /
( demon_main ) > /dev/null 2>&1 < /dev/zero &

exit 0

mky ★★★★★
()
Ответ на: комментарий от mky

Спасибо

Еще раз спасибо. Чувствую пришло мне время нарыть какую нибудь книгу с названием типа «Теория баш скриптов»

dromer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.