2017-09-12 15 views
0

私はサーバ的なことを試みましたが、なぜ '行10'が '行9'の前に実行されるのか理解できません。9行目の出力の前にこの印刷行が印刷されるのはなぜですか?

実際のコード:

df -PH | grep -vE '^Filesystem|tmpfs|cdrom|loop' | awk '{ print $5 " " $1 " " $6}' | while read output; 
    do 
    proc=$(echo $output | awk '{ print $1}' | cut -d'%' -f1) 
    partition=$(echo $output | awk '{ print $2 }') 
    mountp=$(echo $output | awk '{ print $3 }') 
    ohostn=$(checkOtherHostname) 

    if [ $proc -ge $THRESHOLD_HD ]; then 
     printf "%20s [%6s] [%20s] %4s%% \"%s\"\n" "$(hostname)" "$ohostn" "$mountp" "$proc" "$partition" 
     sudo du -sh $mountp/* 
    fi 
    done 

結果は以下のOUTPUTです。

その後、最初のif文の下に2番目のif文を入れて別の方法で試してみました。その中でsudoコマンドを動かしたところ、出力は同じでした!

df -PH | grep -vE '^Filesystem|tmpfs|cdrom|loop' | awk '{ print $5 " " $1 " " $6}' | while read output; 
    do 
    proc=$(echo $output | awk '{ print $1}' | cut -d'%' -f1) 
    partition=$(echo $output | awk '{ print $2 }') 
    mountp=$(echo $output | awk '{ print $3 }') 
    ohostn=$(checkOtherHostname) 

    if [ $proc -ge $THRESHOLD_HD ]; then 
     printf "%20s [%6s] [%20s] %4s%% \"%s\"\n" "$(hostname)" "$ohostn" "$mountp" "$proc" "$partition" 
    fi 

    if [ $proc -ge $THRESHOLD_HD ]; then 
     sudo du -sh $mountp/* 
    fi 
    done 

OUTPUT:

1.1T /data/svn_repo_01/repos 
16K /data/svn_repo_01/lost+found 
2.7G /data/svn_repo_01/csvn 
4.0K /data/svn_repo_01/migration 
4.0K /data/svn_repo_01/tmp 
      vmappp21 [svntoy] [ /data/svn_repo_01] 70% "/dev/sde1" 
+0

これは役立つかもしれない:[bashスクリプトをデバッグする方法は?](http://unix.stackexchange.com/q/155551/74329) – Cyrus

答えて

1

短い答え:それは起こるべきではありません。

私は、私の環境であなたの問題を再現できなかったが、あなたは私たちにいくつかの関連情報を与えていない:

  • のbash --versionを。例えば。 GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
  • checkOtherHostnameは何ですか?
  • 現在のstdoutが(例えば、パイプを介して、またはexec >を使用して)より高いレベルでのパフォーマンスについて

をリダイレクトされている場合あなたの質問を行うには

何も、私はあなたがfolowingを使用気づきましたコマンド:

  • DF、grepを(一回の実行)
  • AWK(4回:各つの実行行)
  • カット、エコー、ホスト名とcheckOtherHostname(各df行に対して1つの実行)
  • のprintf、須藤、デュ(場合PROC> = THRESHOLD_HD)は、小さなスクリプトは、特別な性能なしだよう

しかし、それは問題ではありませんが、より大きなスクリプトで同じアプローチを使用したり、多くのレコードを処理しようとしている場合は必要です。それは問題になる可能性があります。

だから私は、コマンドの最小限の量を使用して、スクリプトのこの縮小版を作った:

  • DF、ホスト名とcheckOtherHostname(1時間)
  • のprintf、須藤、デュ(ときPROC> = THRESHOLD_HD)
hostname="$(hostname)" 
ohostn="$(checkOtherHostname)" 
df -PH | while read partition size used avail proc mountp; do 
    if ! [[ "$partition$mountp" =~ "Filesystem|tmpfs|cdrom|loop" ]] && [ ${proc%%%} -ge $THRESHOLD_HD ]; then 
     printf "%20s [%6s] [%20s] %4s \"%s\"\n" "$hostname" "$ohostn" "$mountp" "$proc" "$partition" 
     sudo du -sh $mountp/* 
    fi 
done 
関連する問題