2012-03-19 14 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日午後08時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日午後4時04分25秒UTC 2012のi686 GNU/Linuxの

説明-rd lsb_release: Debian GNU/Linuxの6.0.4(スクイーズ)
リリース:6.0.4

のbash --version
GNU bashのは、バージョン4.1.5(1)-release(i486の-pc-linux-gnuのよう)

+0

サーバーの違いは何ですか?エラーメッセージは、あなたが正しいBashバージョンを持っているかのようにぼんやりと見えますが、基本アーキテクチャはプロセス置換をサポートしていません...おそらく。 'uname -a'、' lsb_release -rd'、 'bash --version'などの出力は、診断に役立つかもしれません。 – tripleee

+0

@トリプルを行った。チェックアウト編集 – ParoX

+0

@treepleeeまた、 'ps ax | grep '[p] sfront -p。* -r /home/.*/palace' | | * \([0-9] * \)。*/home/\(。* \)/ palace。* $ | \ 2 | ' |ユニーク|ソート 'と' ps ax | grep '[p]サーバー。* -f /home/.*/palace/psdata/pserver.conf' | | * \([0-9] * \)。*/home/\(。* \)/ palace。* $ | \ 2 | ' |ソートは両方のサーバーで必要に応じて動作します。 – ParoX

答えて

1

プロセスの置換にはLinux上で/dev/fd/*が必要です(実装方法はBashの構築方法によって異なります)。おそらく、このスクリプトが実行されている時点で、/dev/の構造が壊れている可能性がありますか?そのようなことが起こるようなもの。

ここでは、/tmpがまだマウントされていないこちらのドキュメントを生成しようとしたときに、起動時のbashスクリプトが失敗しています(そして、tmpfs以降になるため、ルートボリュームにどこか他の)。

プロセス置換は、そのシステムでは全く機能しますか?つまり、起動しているシステムにログインすると、

のようなことができますか?

問題が解決しない場合は、/devを修正する必要があるか、バッシュが構築されている方法を変更する(これは、プロセスの交代のfifo Sを使用してもらう)か、単にプロセス置換に依存しないようにスクリプトを変更します。

0

新しいサーバーでBashでプロセス置換を有効にする方法を理解できない場合は、おそらくより伝統的な処理モデルを使用するようにスクリプトをリファクタリングする必要があります。基本的には、一時ファイルを使用することになります。あなたはそれでいる間、あなたが#!/bin/shにシェバング行を変更できるよう

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です。

grep | sedを簡略化し、繰り返し機能をリファクタリングする必要があります。また、テンポラリファイルを適切に使用するには、を使用して、途中で信号が途切れても一時ファイルを削除する必要があります。

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

関連する問題