Сценарий оболочки работает нормально на одном сервере, но не на другом - PullRequest
1 голос
/ 07 февраля 2011

следующий скрипт работает нормально на одном сервере, но на другом он выдает ошибку

#!/bin/bash

processLine(){
  line="$@" # get the complete first line which is the complete script path 
name_of_file=$(basename "$line" ".php") # seperate from the path the name of file excluding extension
ps aux | grep -v grep | grep -q "$line" || ( nohup php -f "$line" > /var/log/iphorex/$name_of_file.log & ) 
}

FILE=""

if [ "$1" == "" ]; then
   FILE="/var/www/iphorex/live/infi_script.txt"
else
   FILE="$1"

   # make sure file exist and readable
   if [ ! -f $FILE ]; then
    echo "$FILE : does not exists. Script will terminate now."
    exit 1
   elif [ ! -r $FILE ]; then
    echo "$FILE: can not be read. Script will terminate now."
    exit 2
   fi
fi
# read $FILE using the file descriptors
# $ifs is a shell variable. Varies from version to version. known as internal file seperator. 
# Set loop separator to end of line
BACKUPIFS=$IFS
#use a temp. variable such that $ifs can be restored later.
IFS=$(echo -en "\n")
exec 3<&0 
exec 0<"$FILE"
while read -r line
do
    # use $line variable to process line in processLine() function
    processLine $line
done
exec 0<&3

# restore $IFS which was used to determine what the field separators are
IFS=$BAKCUPIFS
exit 0

Я просто пытаюсь прочитать файл, содержащий путь различных сценариев, а затем проверяю, являются ли эти сценарии ужеработает и если не работает их.Файл /var/www/iphorex/live/infi_script.txt определенно присутствует.Я получаю следующую ошибку на моем сервере Amazon -

[: 24: unexpected operator
infinity.sh: 32: cannot open : No such file

Спасибо за вашу помощь заранее.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2011

Вы должны просто инициализировать файл с

FILE=${1:-/var/www/iphorex/live/infi_script.txt}

и затем пропустить проверку существования.Если файл не существует или недоступен для чтения, exec 0 <завершится с ошибочным сообщением об ошибке (нет смысла пытаться угадать, каким будет сообщение об ошибке, просто дайте оболочке сообщить об ошибке.) </p>

Мне кажется, проблема в том, что оболочка на отказавшем сервере не похожа на "==" в тесте на равенство.(Многие реализации теста принимают только один «=», но я подумал, что даже в более старом bash есть встроенная функция, которая принимает два «==», так что я могу быть далеко от базы.) Я бы просто исключил ваши строки из FILE = "" вплоть доконец проверки существования и замените их приведенным выше назначением, позволяя стандартному механизму оболочки работать на вас.

Обратите внимание, что если вы отмените проверку существования, вам нужно либо добавить

set -e

в верхней части скрипта или добавьте проверку на exec:

exec 0<"$FILE" || exit 1

, чтобы скрипт не продолжался, если файл не используется.

1 голос
/ 07 февраля 2011

Для bash (и ksh и других) вы хотите [[ "$x" == "$y" ]] с двойными скобками. Это использует встроенную обработку выражений. Одиночная скобка вызывает исполняемый файл test, который, вероятно, раздражает ==.

Кроме того, вы можете использовать [[ -z "$x" ]] для проверки строк нулевой длины вместо сравнения с пустой строкой. См. «УСЛОВНЫЕ ВЫРАЖЕНИЯ» в руководстве по bash.

...