디렉터리 크기 변경을 모니터링하려면 bash 스크립트가 필요합니다. 디렉토리는 하위 디렉토리의 크기가 매우 다양한 여러 사용자(500-600)가 있는 NFS 파일 시스템입니다. 예를 들어/home/nfs/xxx/ccc 등입니다. 디렉터리 크기가 10GB 또는 20GB보다 크거나 실제로 이 크기를 초과하는 특정 사용자를 모니터링하고, 기록하고, 보고할 수 있어야 합니다. 이를 문서화하고 해당 사용자에게 "친숙한" 이메일을 보내야 합니다. 나는 이 작업을 수행하기 위해 유틸리티 및/또는 도구를 사용하고 싶지 않고 오히려 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'
리터럴 string$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
그러나 그렇게 하는 것보다 출력을 반복 하고, 각 디렉터리의 크기를 확인하고, 10GB 또는 20GB를 초과하면 소유자에게 이메일을 보내는 것이 더 나을 것입니다. 가장 큰 디렉터리는 아마도 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 파일 서버에 설치 및 구성되어야 합니다.