2

次のようなディスク スクリプトがあります。

#!/bin/bash

filesys=(
/
)
[ -f "$(pwd)/filesys.conf" ] && filesys=($(<$(pwd)/filesys.conf))

date=$(date +"%d\/%m\/%Y")

df -P "${filesys[@]}" |
sed -ne 's/^.* \([0-9]\+\)% \(.*\)$/'$date', \2, \1%/p' > disk.log

ファイルシステムの作業用に filesys.conf があります。

/
/run

そして、これが出力されます(disk.log):

23/05/2016, /, 78%
23/05/2016, /run, 0%

質問:

サーバーのファイルシステムは常に変更されるため、filesys.conf が必要です。conf ファイルは簡単です。しかし、次のように filesys.conf にも使用パラメータを追加する必要があります。

/,90
/run,99

/使用率が 90 を超える場合、/run使用率が 99 を超える場合は、ログ ファイルに書き込みます。

これどうやってするの?

4

1 に答える 1

2

フォームの filesys.conf ファイルから bash 連想配列を作成しましょうassoc[file system]=threshold。このようにして、それをループして の出力と比較できますdf -P

ファイルを考えると:

$ cat filesys.conf
/,90
/dev,25

これを配列に格納します (ソース: Bash reading from a file to an associative array ):

declare -A assoc
while IFS=, read -r -a array;
do
    assoc[${array[0]}]=${array[1]}
done < filesys.conf

したがって、値は次のとおりです。

$ for k in "${!assoc[@]}"; do echo "${k} --> ${assoc[$k]}"; done
/dev --> 25
/ --> 90

dfの出力を次のように処理するだけですawk

mydate=$(date "+%d/%m/%Y")
for k in "${!assoc[@]}"
do
    df -P "${k}" | awk 'NR==2 && $(NF-1)+0 > limit {print date, fs, $(NF-1)}' OFS=, fs="$k" date=mydate limit="${assoc[$k]}"
done >> disk.log

これは にパイプdfawkます。そこで、2 行目 (最初の行はヘッダーであり、明らかに出力から削除することはできませman dfん (言及されていません)) と、最後から 2 番目の列の値を確認します。その値が指定されたしきい値よりも大きい場合、目的の出力を出力します。

列を int$(NF-1)+0にキャストするトリックに注意してください。形式は に変換されます。Use%13%13

于 2016-05-23T08:30:25.000 に答える