сценарий оболочки, чтобы проверить, должна ли программа быть запущена, и перезапустить ее, если это необходимо

#bash #shell #scripting

#bash #оболочка #сценарии

Вопрос:

У меня есть следующий скрипт

 #!/bin/sh
if [cat stream_should_be_running.txt == 'true']; then #file will either contain true or false
    if [ps ax|grep -v grep|grep tracker_stream]; then # check if stream is currently running
        exit 0
    else
        /usr/local/bin/python2.7 ~/webapps/dashboard/fbadmin/manage.py tracker_stream; # restart stream
        exit 0
else
    exit 0
fi
  

Этот скрипт должен проверять, должен ли выполняться сценарий демона. Если предполагается, что он запущен, он проверяет, запущен ли скрипт, и перезапускает его, если это не так. В настоящее время я получаю syntax error: unexpected end of file , когда пытаюсь запустить файл вручную.

Итак, два вопроса:

  1. почему я извлекаю синтаксическую ошибку
  2. вне этого должен ли этот скрипт работать правильно?

Спасибо


РЕДАКТИРОВАТЬ: вот обновленная версия скрипта и несколько заметок:

 #!/bin/sh
set -vx; # turn on shell debugging

if [[ "$(cat stream_should_be_running.txt)" == "true" ]]; then
    if [ ps ax|grep -v grep|grep -q tracker_stream ]; then
        exit 0
    else
        /usr/local/bin/python2.7 ~/webapps/dashboard/fbadmin/manage.py tracker_stream;
        exit 0
    fi
else
    exit 0
fi
  

к сведению:

  • vim помечается $(...) как синтаксическая ошибка (я не знаю, имеет ли это значение)
  • ps ax|grep -v grep|grep -q tracker_stream , ps ax|grep -v grep|grep tracker_stream , и cat stream_should_be_running.txt все выполняются правильно из командной строки

РЕДАКТИРОВАТЬ 2: отладка оболочки выдает ошибку

 $ sh stream_checker.sh

  $'r'
: command not foundline 3: 
if [[ "$(cat stream_should_be_running.txt)" == "true" ]]; then 
    echo 'test';
    if [ ps ax|grep -v grep|grep -q tracker_stream ]; then 
        exit 0
    else
    /usr/local/bin/python2.7 ~/webapps/dashboard/fbadmin/manage.py tracker_stream;
    exit 0
    fi
else
    exit 0
fi
  

stream_checker.sh : строка 15: синтаксическая ошибка: неожиданный конец файла

итак, единственное, что предшествует тому, что $'r' возвращает is #!/bin/sh , — это and set -vx .

Это выполняется в системе Linux. Моя локальная машина — osx lion, а живая машина — сервер Linux на webfaction.

Комментарии:

1. Почему бы вам просто не записать pid в файл вместо этого и выполнить a kill -0 pid и проверить код возврата, нулевой, если он запущен, отличный от нуля, он не запущен.

2. Пользователь может установить, должен ли быть запущен tracker_stream. Это действие изменяет значение в stream_should_be_running.txt от ложного к истинному. Остальная часть скрипта, который я показал, просто поддерживает tracker_stream как демон, когда он активен.

3. Попробуйте запустить с помощью ./sh -x script.sh

4. использование sh -x script.sh , похоже, ничего не меняет…

5. Ну, это не должно, но что это показывает?

Ответ №1:

1) Я думаю, что я понял…

Я использовал переключатель ‘-s’ в pidof, чтобы получить только один результат.
Переключатель ‘-z’ означает «возвращать true, если строка пуста».

 #!/bin/sh
PID=$(pidof -s tracker_stream);
if [ $(cat stream_should_be_running.txt) = "true"]; then #file will either contain true or false
    if [ -z $PID ]; then # check if stream is currently NOT running
        /usr/local/bin/python2.7 ~/webapps/dashboard/fbadmin/manage.py tracker_stream; # restart stream
        exit 0;
    fi
fi
  

РЕДАКТИРОВАТЬ: из последней заметки, которую вы опубликовали, похоже (^M) , что где-то в вашем файле может быть символ Ctrl-M.
Это не просто a ^ , за которым следует a M , это символ конца строки.

Вы можете открыть свой файл с vim -b помощью, чтобы проверить, видите ли вы какие-либо из этих символов. Затем введите:

 :%s/^V^M//g 
  

Эта команда читается как «сопоставьте все (^ M) символы и замените их на void».
Короче говоря, он удалит все (^ M) символы из вашего файла.
Бит (^ V ^ M) означает, что вам нужно нажать CTRL-V CTRL-M, чтобы вставить символ (^ M).

2) что именно вы подразумеваете под «вне этого»?

Комментарии:

1. что касается вашего вопроса. Я не очень хорошо знаком со сценариями оболочки, и поэтому я не уверен, какие другие части этого кода могут выдавать ошибку. Моя главная проблема заключается в том, можете ли вы использовать cat для возврата true или false из файла и завершения блока if на основе этого.

2. Я проверил, и да, вы можете сделать что-то вроде: if [ $(cat a.txt ) = «true» ]; (И он вернет, если ваш файл будет иметь значение «false», например)

3. Вы также можете просто создать этот файл, оставить его пустым и просто проверить, существует ли файл с помощью переключателя ‘-f’: [ -f stream.txt ] Однако позже вам нужно будет удалить его…

4. к сожалению, pidof не существует в системе Unix, в которой я запускаю это. В любом случае tracker_stream — это команда управления django, поэтому использование ps — практически единственный способ поиска pid.

5. Если у вас нет pidof, вы можете использовать pgrep, хотя я предполагаю, что у вас, вероятно, его тоже нет…

Ответ №2:

в ваших квадратных скобках нужны пробелы вокруг них, т.е.

 if [ ps ax|grep -v grep|grep tracker_stream ] ;
  

И что более важно, вам нужно использовать подстановку команд, чтобы ваш скрипт мог получить значение внутри stream_should_be_running.txt using $( cat ... ) , т.е.

 if [[ "$(cat stream_should_be_running.txt)" == 'true' ]] ; then 
    #file will either contain true or false
    if[ ps ax|grep -v grep|grep -q tracker_stream ] ; then 
        # check if stream is currently running
        exit 0
    else
        /usr/local/bin/python2.7 ~/webapps/dashboard/fbadmin/manage.py tracker_stream; 
        # restart stream
        exit 0
else
    exit 0
fi
  

Также лучше использовать dbl-кавычки для значения, возвращаемого $(cat ...) в случае, если в файле есть пробелы.

Наконец, включите отладку оболочки, добавив set -vx сценарий near top. Затем вы можете указать каждую строку / блок кода по мере его выполнения И значения, которые заменяются переменными.

Надеюсь, это поможет.

Комментарии:

1. спасибо, я определенно ищу указатели, подобные этому, но это не устраняет синтаксическую ошибку.

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

3. У меня такое чувство, что мы постепенно приближаемся, но, похоже, это не решило синтаксическую ошибку

4. Обратите внимание на добавление -q к вашему последнему grep во 2-м if . Проверьте эту строку отдельно, если вы получите сообщение об ошибке, удалите -q и поместите >/dev/null 2>amp;1 в конец строки. Если включено set -vx , отредактируйте свое сообщение, чтобы информация об отладке отображалась непосредственно перед сообщением об ошибке. Удачи.

5. Если вы использовали set -x , то мы не можем видеть, какая команда выполнялась, которая возвращалась $'r' . Если вы использовали set -vx , нам нужно увидеть строку выше того, что вы включили. Alson $ ‘ r’ указывает файл на основе DOS, вы используете Windows? Вам нужен файл без $ ‘ r’ . Удачи.