파일이 특정 크기 제한에 도달하면 이메일을 보내고 싶습니다.
내가 생각할 수 있는 유일한 방법은 파일 크기를 확인하고 파일이 필요한 것보다 큰 경우 이메일을 보내는 cronjob을 실행하는 것입니다.
그러나 파일 크기를 확인하는(가령 15-30분마다) cronjob을 추가하는 것이 나에게는 나쁜 해결책인 것 같습니다.
파일에 텍스트가 첨부된 경우(이벤트?)를 자동으로 감지하여 크기를 확인하고 필요한 처리를 수행할 수 있는 더 좋은 방법이 있는지 궁금합니다.
답변1
이를 수행하는 두 가지 방법을 생각할 수 있습니다. 설정된 빈도로 "stat" 명령을 실행하는 while 루프를 사용하여 파일이 필요한 것보다 큰지 확인하는 검사를 수행할 수 있습니다. 그렇다면 이메일을 보내주세요. 이 방법은 효과가 있지만 파일에 이벤트가 있는지 여부에 관계없이 설정된 시간 빈도로 "stat" 명령을 실행하므로 약간 비효율적일 수 있습니다.
또 다른 접근 방식은 명령을 사용하여 관찰자를 구독할 수 있는 파일 시스템 이벤트를 사용하는 것입니다 inotifywatch
.
방법 #1 - X초마다 예시
스크립트에 다음을 입력하면 다음과 같이 말합니다 notify.bash
.
#!/bin/bash
file="afile"
maxsize=100 # 100 kilobytes
while true; do
actualsize=$(du -k "$file" | cut -f1)
if [ $actualsize -ge $maxsize ]; then
echo size is over $maxsize kilobytes
.... send email ....
exit
else
echo size is under $maxsize kilobytes
fi
sleep 1800 # in seconds = 30 minutes
done
그런 다음 이를 실행하면 파일에 대한 모든 액세스가 보고되고, 해당 액세스로 인해 파일 크기가 최소 크기를 초과하는 경우 이메일 전송 및 종료가 트리거됩니다. 그렇지 않으면 현재 크기를 보고하고 계속해서 파일을 감시합니다.
방법 #2 - 액세스 예시만 확인
보다 효율적인 접근 방식은 실제로 액세스될 때만 파일을 확인하는 것입니다. 액세스 유형은 다양할 수 있습니다. 이 예에서는 파일 액세스만 모니터링하는 방법을 보여주지만 파일이 닫히는 등의 다른 이벤트만 모니터링할 수 있습니다. 파일 이름을 다시 지정합니다 notify.bash
.
#!/bin/bash
file=afile
maxsize=100 # 100 kilobytes
while inotifywait -e access "$file"; do
actualsize=$(du -k "$file" | cut -f1)
if [ $actualsize -ge $maxsize ]; then
echo size is over $maxsize kilobytes
.... send email ....
exit
else
echo size is under $maxsize kilobytes
fi
done
이 스크립트를 실행하면 다음과 같은 출력이 생성됩니다.
$ ./notify.bash
Setting up watches.
Watches established.
파일에 대한 일부 활동을 생성하면 이제 파일의 크기가 다음과 같이 보고됩니다.
$ seq 100000 > afile
$ du -k afile
576 afile
알림 스크립트의 출력:
afile ACCESS
size is over 100 kilobytes
이 시점에서 종료됩니다.
이메일을 보내
이 활동을 수행하려면 스크립트에서 다음과 같이 하면 됩니다.
subject="size exceeded on file $file"
emailAddr="[email protected]"
mailCmd="mail -s \"$subject\" \"$emailAddrs\""
( echo ""; echo "DATE: $(date)"; ) | eval mail -s "$subject" \"$emailAddr\"
지침
두 번째 방법은 대부분의 경우에 작동합니다. 한 가지 경우는 $maxsize
스크립트가 호출될 때 파일이 초과되고 해당 유형의 파일에 추가 이벤트가 없는 경우 입니다 access
. 이 문제는 스크립트에서 추가 검사를 수행하거나 스크립트가 호출될 때 실행되는 이벤트를 확장하여 inotifywatch
해결할 수 있습니다.