ディレクトリサイズの変更を監視するには、bashスクリプトが必要です。ディレクトリは、サブディレクトリのサイズが非常に異なる複数のユーザー(500〜600)を持つNFSファイルシステムです。たとえば、/home/nfs/xxx/ccc などです。ディレクトリサイズが10 GBまたは20 GBを超えるか、実際にこのサイズを超える特定のユーザーを監視、記録、および報告できる必要があります。これを文書化し、そのユーザーに「おなじみの」Eメールを送信する必要があります。私はこれを行うためにユーティリティやツールを使用したくなく、むしろbashスクリプトを使用したいと思います。スクリプトが一時的に実行されます。
どんな助けでも大変感謝します。
山
これまでの努力 -
#!/bin/bash
set -x
DISK="/cluster/vvvvvvv1/nfs-home/zzz" # Verzeichnis
CURRENT=$(df -h | grep ${DISK} | awk {'print $4'}) # get disk usage from monitored disk
MAX="70%" # max nn% disk usage
DOMAIN="naz.ch"
# Max Exceeded now find the largest offender
cd $DISK
for i in `ls` ; do du -sh $i ; done > /tmp/mail.1
sort -gk 1 /tmp/mail.1 | tail -1 | awk -F " " '{print $2}' > /tmp/mail.offender
OFFENDER=`cat /tmp/mail.offender`
echo $OFFENDER
du -sh $DISK/$OFFENDER > /tmp/mail.over70
mail -s "$HOSTNAME $DISK Alert!" "$OFFENDER@$DOMAIN" < /tmp/mail.over70
# check if current disk usage is greater than or equal to max usage.
if [ ${CURRENT} ]; then
if [ ${CURRENT%?} -ge ${MAX%?} ]; then
# if it is greater than or equal to max usage we call our max_exceeded function and send mail
echo "Max usage (${MAX}) exceeded. The /home disk usage is it at ${CURRENT}. Sending email."
max_exceeded
fi
fi
# init #
# main
#CLEANUP
答え1
#assuming that your users are subfolders to same parent
disk=/home/disk # which contains users dirs user-{1..999}
limit='75%'
current=$(df -k ${disk} | tail -1| awk '{print $5}')
max=10000000000 #in kilobytes (10G)
if [[ ${current//%/} -gt ${limit//%/} ]];then
echo disk limit has been exceeded ${disk}
# do your magick here
fi
find ${disk} -type f -exec du -k {} + | sort -nr | while read s f;do
if test ${s} -gt ${max};then
fsplt=(${f//\// }) # '/x/y/z' to 'x y z' as array
echo "file size exceeded limits | user:${fsplt[2]} file:${f}";
# do whatever here with file and user;
else
break; #cuz the list is sorted all remainning are smaller files
fi
done
# you can customize find option to find only bigger than X size (optional)
答え2
あなたのスクリプトにはいくつかの欠陥があり、そのいくつかは深刻です。
いいえ解析された出力
ls
。バラよりなぜいいえ解析ls
(および実行方法)?必要もありません。 "for i in
ls
; do du -sh $i ; did > /tmp/mail.1" はループを必要とせず、次のように書く方が良いでしょう。du -sch */ > /tmp/mail.1
でも:
du -sch */ | sort -gk 1 | tail -n 1 > /tmp/mail.1
$1
変数拡張(たとえば、シェルの引数など)は、ほぼ常に二重引用符で囲む必要があります$2
。しかし、場合によってはこれをしたくないかもしれません(例えば、実際に考えるシェルは通常、単語の分離を実行します。これは非常にまれで、一般的に望み、実行する必要がある作業と正反対です。簡単に言えば、良い経験則は、「この特別な場合に引用したくない理由を正確に知らない限り、常に引用すること」です。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?、$VAR対${VAR}と引用、bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスクといつ二重引用符が必要ですか?。
ただし、変数の補間を実行するには二重引用符を使用し、固定文字列には一重引用符を使用します。二重引用符は、その中のすべての変数などを拡張します。一重引用符はありません。たとえば、
'$foo'
リテラル文字$foo
列です"$foo"
が、代わりにコンテンツという変数です$foo
。実際には必須ではありませんが、最善の方法は、独自の変数にすべて小文字または大文字と小文字の混合変数名を使用して、その名前がシェルまたは他のプログラムで使用される環境変数(ほぼ常に使用される)と競合しないようにすることです。すべて大文字(たとえば、
$HOSTNAME
使用中の環境変数)は、すべての子プロセスがそれを継承するように、起動プロセスの最初に自動的に環境にエクスポートされます。最も多くのディスクスペースを使用している単一の「犯人」(そしてそれらが使用しているスペースの量)を探したいので、これを行うために一時ファイルを使用する必要さえありません。次のことができます。
disk="/cluster/vvvvvvv1/nfs-home/zzz" subject="$HOSTNAME $disk Alert!" domain='naz.ch' read -r size offender < <(du -sch */ | sort -gk 1 | tail -n 1 | awk -F'[[:space:]]+|/' '{print $1, $2}') if [ -n "$offender" ] ; then cat <<__EOF__ | mail -s "$subject" "$offender@$domain" Your current disk usage is $size. Please compress or delete any unnecessary files or directories. __EOF__ fi
du -sch
ただし、そうするよりも出力を繰り返し、各ディレクトリのサイズを確認し、10 GBまたは20 GBを超えると、所有者に電子メールを送信する方が良いでしょう。最大のディレクトリは、おそらく10〜20GBの制限より小さいでしょう。 。ディレクトリ名が必ずしも所有者のユーザー名と同じである必要はありません。ユーザーのホームディレクトリは、ユーザーと同じ名前を持つことがよくありますが、必ずしもそうではありません。 いいえls
ディレクトリ所有者を取得するために解析された出力 - 代わりに使用してくださいstat
。上記のスクリプトスニペットは、必要に応じてこれを行う方法の一例にすぎず、実際にそれを行うのにはお勧めできません。
ところで、おそらく既存を使用する必要があります。シェア自分で書く代わりにツールを使用してください。使用状況レポートをメールで送信するスクリプトがあるだけでなく、ユーザーおよび/またはグループごとにカーネル強制クォータ制限を設定することもできます。 Linuxを使用している場合は、展開用のパッケージとしてほぼ確実に使用できます。たとえば、Debianではquota
パッケージにあるのでsudo apt-get install quota
。
インストールと使用のための非常に良い基本的なquota
チュートリアルがあります。Linuxクォータ - UbuntuとDebianでのインストールと設定- 他のディストリビューションの場合、インストール方法は異なる場合がありますが(例:Fedoraを使用するか、yum
代わりにdnf
使用するapt
)、構成と使用法は同じです。 Arch Linux wikiにも良いチュートリアルがあります:ディスククォータ
クォータは、NFSクライアントコンピュータではなくNFSファイルサーバーにインストールして設定する必要があります。