#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
, когда пытаюсь запустить файл вручную.
Итак, два вопроса:
- почему я извлекаю синтаксическую ошибку
- вне этого должен ли этот скрипт работать правильно?
Спасибо
РЕДАКТИРОВАТЬ: вот обновленная версия скрипта и несколько заметок:
#!/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’ . Удачи.