Проблема с bash скриптом

Добрый день.
Понадобилось организовать проверку работы демона с последующим запуском, при его отсутствии.
Ниже привожу скрипт.
#!/bin/bash

if ps -A | grep ices
then
echo "true"
  killall ices && ices -c /etc/icecast2/ices.conf
else
  `ices -c /etc/icecast2/ices.conf`
echo "false"
fi

Проблема собственно в том, что если демон запущен, то он благополучно килится и перезапускается, но если он не запущен, то вторая часть скрипта не запускается, т.е то что после else. Пробовал указывать полный путь до исполняемого файла, результат тот же. Курю маны по служебным символам баша, но как то пока безрезультатно, где я ошибся?

0
Master_Yoda - 10 Ноябрь, 2013 - 10:18

Может как-то так надо:

6.3 Пример: элементарный пример условного оператора if .. then ... else

            #!/bin/bash
            if [ "foo" = "foo" ]; then
               echo-выражение вычислилось как истина
            else
               echo-выражение вычислилось как ложь
            fi

Источнег.

0
lord_i - 10 Ноябрь, 2013 - 12:05
Изображение пользователя lord_i.

Кавычки надо убрать в случае false и будет Вам счастье.

0
DarkneSS - 10 Ноябрь, 2013 - 12:11
Изображение пользователя DarkneSS.

А не запускается, потому что `` в этом случае абсолютно лишние. Просто уберите их.

Форматирование ещё странное, но баш в этом плане не привередлив))

0
MaximChuvashev - 10 Ноябрь, 2013 - 14:01

форматирование стандартное :)
В ИжГТУ, на первом курсе, когда учили(xD) паскаль и делфи - нас так учили оформлять код.

0
DarkneSS - 10 Ноябрь, 2013 - 15:10
Изображение пользователя DarkneSS.

then
echo "true" # входим в ветвление, отступа нет
  killall ices && ices -c /etc/icecast2/ices.conf
else
  `ices -c /etc/icecast2/ices.conf`
echo "false" # мы всё ещё в ветвлении, отступ пропал

Вот стандартное:if [ "$VGIT" == "$VOBS" ]

then
  echo -e '\e[0;4m\nNo changes.\e[0m'

else

  cd $DGIT
  git log $VOBS..HEAD --date=raw --full-diff --name-only
  cd $DOBS
  # вырезал многабукаф

fi

0
Гость - 10 Ноябрь, 2013 - 19:29

#!/bin/bash

if ps -A | grep ices
then
echo "true"
  killall ices && ices -c /etc/icecast2/ices.conf &
else
  echo "false"
  ices -c /etc/icecast2/ices.conf &
fi

0
Гость - 10 Ноябрь, 2013 - 20:11

#!/bin/bash
#сравните:
if [ 0 -gt 2 ]
then
    #не исполняется
    echo "nou"
else
    `emacs` #к примеру
    echo "yes" #не выводица
fi


# и


if [ 0 -gt 2 ]
then
    #не исполняется
    echo "nou"
else
    emacs &
    echo "yes" #выводица
fi

0
DarkneSS - 10 Ноябрь, 2013 - 21:17
Изображение пользователя DarkneSS.

else
    `emacs`
Зачем?..
    echo "yes" #не выводицаНе выводится, пока не будет завершён емакс, если он вообще будет запущен с этими кавычками.
else
    emacs &
    echo "yes" #выводица
Тут всё красиво и логично, запускаем емакс в отдельном потоке.

+1
awam - 11 Ноябрь, 2013 - 02:44

Спасибо всем и DarkneSS с lord_i в частности :) кавычки убрал, но скрипт заработал не сразу, был еще один косяк, на который я сразу не обратил внимания, а именно, файл скрипта назывался reices.sh ну и соответственно, условие всегда выполнялось потому что скрипт находил процесс с таким сочетанием :)
А про форматирование, я руководствовался больше удобством чтения.

0
Flameflower - 11 Ноябрь, 2013 - 06:37
Изображение пользователя Flameflower.

Можно, кстати, попробовать реализовать по другому.
Ищем PID некоего процесса и записываем его в переменную.
Далее сравниваем, если значение переменной пустое - запускаем процесс, если нет - выходим из скрипта.
#!/bin/sh
SOME_VAR=$(pgrep pptpd)

set -x

if [ -z "$SOME_VAR" ]
then
echo "PPTPD not running."
service pptpd start
else
echo "PPTPD is running. PID:$SOME_VAR"
fi

Вместо PPTPD и действий вставить свой набор команд.

0
awam - 11 Ноябрь, 2013 - 17:07

Можно и так, ices в свою базовую директорию пишет файлик с pid, так что его можно и от туда взять :)
Типа так
kill `cat /tmp/ices.pid`

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры