1

以下脚本在一台服务器上运行良好,但在另一台服务器上出现错误

#!/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肯定存在。我在我的亚马逊服务器上收到以下错误-

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

提前感谢您的帮助。

4

2 回答 2

3

你应该只用初始化文件

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

然后跳过存在检查。如果文件不存在或不可读,则 exec 0< 将失败并显示合理的错误消息(您没有必要猜测错误消息是什么,只需让 shell 报告错误即可。)

我认为问题在于失败服务器上的外壳在相等测试中不喜欢“==”。(许多测试的实现只接受一个'=',但我认为甚至更旧的bash有一个接受两个'=='的内置函数,所以我可能会偏离基础。)我会简单地将你的行从 FILE="" 删除到存在检查的结尾并用上面的赋值替换它们,让 shell 的标准默认机制为您工作。

请注意,如果您确实消除了存在检查,您将需要添加

设置-e

在脚本顶部附近,或在 exec 上添加检查:

执行 0<"$FILE" || 1号出口

这样如果文件不可用,脚本就不会继续。

于 2011-02-07T13:42:25.187 回答
1

对于 bash(以及 ksh 和其他),您需要[[ "$x" == "$y" ]]使用双括号。这使用内置的表达式处理。一个括号调用test可能在 == 上的可执行文件。

此外,您可以用于[[ -z "$x" ]]测试零长度字符串,而不是与空字符串进行比较。请参阅 bash 手册中的“条件表达式”。

于 2011-02-07T14:10:10.333 回答