2012-03-19 67 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