2012-03-19 66 views
1

BASH区别?在旧的服务器上工作得很好,而不是在新的工作。BASH:安装到新服务器后,功能未运行

它从来没有回声 “使其” 在get_running_palaces()函数,而是输出

COMM是:/ dev/FD/63:没有这样的文件或目录
COMM是:/ dev/FD/63:否这样的文件或目录

#!/bin/bash 

TYPE=$1 

get_palaces(){ 
    for PALACE in $(ls -trI shared /home | sort); do 
     if [ -d "/home/$PALACE/palace" ]; then 
      echo $PALACE 
     fi 
    done 
} 
# comm -12 file1 file2 Print only lines present in both file1 and file2. 
# comm -3 file1 file2 Print lines in file1 not in file2, and vice vers 
get_running_palaces(){ 
    echo "made it"; 
    PSFRONT_A=$(ps ax | grep '[p]sfront -p .* -r /home/.*/palace ' | sed 's| *\([0-9]*\).*/home/\(.*\)/palace.*$|\2|' | uniq | sort) 
    PSERVER_A=$(ps ax | grep '[p]server.* -f /home/.*/palace/psdata/pserver.conf ' | sed 's| *\([0-9]*\).*/home/\(.*\)/palace.*$|\2|' | sort) 
    ERRORS=$(comm -3 <(echo "${PSERVER_A[*]}") <(echo "${PSFRONT_A[*]}")) 
    if [ ! -z "$ERRORS" ]; then 
     comm -3 <(echo "${PSERVER_A[*]}") <(echo "${ERRORS[*]}") 
    else 
     echo "$PSERVER_A" 
    fi 

} 

case "$TYPE" in 
online) 
    KNOWN_PALACES=$(get_palaces) 
    ERROR_LESS=$(get_running_palaces) 
    ONLINE=$(comm -12 <(echo "${KNOWN_PALACES[*]}") <(echo "${ERROR_LESS[*]}")) 

    [ ! -z "$ONLINE" ] && echo "$ONLINE" 
    ;; 
offline)  
    KNOWN_PALACES=$(get_palaces | sort) 
    ERROR_LESS=$(get_running_palaces) 

    OFFLINE=$(comm -3 <(echo "${KNOWN_PALACES[*]}") <(echo "${ERROR_LESS[*]}")) 

    [ ! -z "$OFFLINE" ] && echo "$OFFLINE" 
    ;; 
*) 
    get_palaces 
    ;; 
esac 


exit 0; 

信息:

新服务器:


UNAME -a
Linux的www.ipalaces.org 2.6.32-274.7.1.el5.028stab095.1#1 SMP周一10月24日20点49分24秒MSD 2011 x86_64的GNU/Linux的
lsb_release - RD
-bash:lsb_release:命令未找到
的bash --version
GNU bash中,版本4.1.5(1)-release下(x86_64-PC-Linux的GNU)


旧服务器:

UNAME -a
Linux的ipalaces.org 2.6.32-5-686#1 SMP周一1月16日16时04分25秒UTC 2012 i686的GNU/Linux的
lsb_release -Rd
说明:的Debian GNU/Linux的6.0.4(挤)
版本:6.0.4

的bash --version
GNU的bash,版本4.1.5(1)-release(1486-PC-Linux的GNU)

+0

服务器之间有什么区别?错误消息看起来很模糊,就像你有正确的Bash版本,但是底层架构不支持进程替换......也许。 'uname -a','lsb_release -rd','bash --version'等的输出可能对诊断有用。 – tripleee 2012-03-19 19:08:08

+0

@tripleee完成。结账编辑 – ParoX 2012-03-19 19:11:40

+0

@tripleee还应该注意的是'ps ax | grep'[p] sfront -p。* -r /home/.*/palace'| sed's | 。* \([0-9] * \)* /家/\(.*\)/宫* $ | \ 2 |” | uniq | sort'和'ps ax | grep'[p] server。* -f /home/.*/palace/psdata/pserver.conf'| sed's | 。* \([0-9] * \)* /家/\(.*\)/宫* $ | \ 2 |” |排序“工作应该在两台服务器上。 – ParoX 2012-03-19 19:12:58

回答

1

Linux上的进程替换需要/dev/fd/*(我认为它是如何实现的,这取决于Bash的构建方式)。也许你在这个脚本运行的地方搞了一个/dev/结构?像这样的东西发生。

我见过启动时bash脚本尝试生成here文档失败,这需要/tmp尚未安装(并且将来自tmpfs,因此根卷中没有这样的目录或其他地方)。

在该系统上是否有进程替换工作?我的意思是,如果您登录到启动并运行的系统,您是否可以执行如下操作:

diff <(echo "a") <(echo "b") 

如果这不起作用,您必须修复/dev或更改Bash的构建方式(让它使用fifo进行流程替换),或者只是将脚本更改为不依赖流程替换。

0

如果您无法弄清楚如何在新服务器上的Bash中启用流程替换,也许您应该重构脚本以使用更传统的处理模型。基本上,这可以归结为使用临时文件。

ps ax | 
grep '[p]sfront -p .* -r /home/.*/palace ' | 
sed 's| *\([0-9]*\).*/home/\(.*\)/palace.*$|\2|' | 
uniq | sort >/tmp/PSFRONT_A 

ps ax | 
grep '[p]server.* -f /home/.*/palace/psdata/pserver.conf ' | 
sed 's| *\([0-9]*\).*/home/\(.*\)/palace.*$|\2|' | 
sort >/tmp/PSERVER_A 

ERRORS=$(comm -3 /tmp/PSERVER_A /tmp/PSFRONT_A) 

rm /tmp/PSERVER_A /tmp/PSFRONT_A 

顺便说一句,这是完全POSIX兼容的,所以你可以在家当线更改为#!/bin/sh,而你在这。

您应该简化grep | sed并重构定期功能;同样,正确使用临时文件要求使用trap删除临时文件,即使脚本在中途被信号中断。

t=`mktemp -t -d palaces.XXXXXXXX` || exit 127 
trap 'rm -rf $t' 0 
trap 'exit 126' 1 2 3 5 15 

psg() { 
    local re 
    re=$1 
    ps ax | 
    sed -n "\\%$re%"'s| *\([0-9]*\).*/home/\(.*\)/palace.*$|\2|p' 
} 

psg '[p]sfront -p .* -r /home/.*/palace ' | 
    uniq | sort >$t/PSFRONT_A 
psg '[p]server.* -f /home/.*/palace/psdata/pserver\.conf ' | 
    sort >$t/PSERVER_A 

comm -3 $t/PSERVER_A $t/PSFRONT_A >$t/ERRORS 

if [ -s $t/ERRORS ]; then 
    comm -3 $t/PSERVER_A $t/ERRORS 
else 
    cat $t/PSERVER_A 
fi 

脚本的其余部分可以相应地调整。

+0

我不完全确定我知道v4中的Bash数组是如何工作的,或者你为什么想要首先使用它们。也许我错过了一些东西。 – tripleee 2012-03-20 12:53:57