منبع اصلی نوشتار زیر در این لینک قرار دارد

اسکریپت برای بررسی Load Average سیستم و ارسال email به مدیر

در این پست اسکریپتی معرفی می شود که، زمانی که Load Average یک سرور بالا می رود، به مدیر ایمیل می زند. از دستور uptime برای تعیین Load Average و استفاده از cron برای زمانبندی اجرای اسکریپت و ارسال گزارش به مدیر سیستم در صورت بالا بودن Load Average استفاده شده است. در خروجی دستور uptime سه عدد پس از عبارت load average معرف Load Average به ترتیب نشان دهنده Load Average، 1، 10 و 15 دقیقه پیش است.

uptime

03:58:13up 68 days, 11:15,  1 user,  load average: 1.36, 1.06, 0.85

متغیر NOTIFY اگر 1 باشد، آنگاه یک امیل به email address مدیر که با متغیر EMAIL مشخص شده ارسال می شود.می توانید چندین email address را با Space ها، در متغیر EMAIL ازهم جدا کنید. متغیر NOTIFY در اصل حد استانه برای اینکه تصمیم بگیریم که آیا Load Average سیستم بالا است یا نه. بطور پیش فرص 1 است و اگر دمین عدد از سه عدد گفته شده (یعنی Load Average در 5 دقیقه پیش بیشتر از این عدد باشد، یعنی میانگین بار سیستم بالا بوده است.

NOTIFY=1

“EMAIL=”admin@falearn.ir amirnami@falearn.ir

متغیر TEMPFILE دستور mktemp را برای ایجاد یک فایل موقتی، استفاده می کنیم. این متغیر نام و مسیر فایلی موقتی را که شامل بدنه (body) پیام ایمل است را در خود نگه می دارد. همانطور که در قطعه کد کامل (قابل دانلود در ادامه) خواهید دید، در هر مرحله  توسط >> متنی به انتهای فایل افزوده می شود و در نهایت بعنوان بدنه ایمیل استفاده می شود. ( متغیر SUBJECT که در ادامه توضح داده شده است بعنوان موضوع (عنوان یا Subject) ایمیل استفاده می شود.

(TEMPFILE=$(mktemp

از متغیر FTEXT عبارت رشته ای load average را در خودش برای فیلتر و جدا کردن تنها سه عدد گفته شده در بالا، از دستور uptime توسط دستور awk استفاده می کنیم. (البته می توانستیم برای فیلتر و جدا کردن سه عدد گفته شده، با استفاده از دستور awk، خود رشته load average : را استفاده کنیم. اما استفاده از یک متغیر ساده تر و بهینه تر می باشد.)

“FTEXT=”load average

اصلی ترین بخش اسکریپت خروجی دستوری است که در متغیر LOAD1MIN ذخیره شده و اجرا می شود. توسط دستور های awk و sed و متغیر FTEXT خروجی دستور زیر را فیلتر وعدد مورد نظر یعنی Load Average را از آن جدا می کنیم و در نهایت این عدد در متغیر LOAD1MIN ذخیره می شود.

uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f1 | sed ‘s/ //g

در دستور بالا توسط awk ابتدا توسط رشته درون متغیر FTEXT، خروجی دستور uptime را فیلتر و سپس توسط متغیر 2$، ستون دوم از خروجی فیلتر شده یعنی سه عدد (ستون اول که خود رشته متغیر FTEXT، دومین ستون، شامل سه مجموعه سه عدد می باشد). سپس خروجی حاصل از awk توسط pipe به ورودی دستور cut ارسال می شود و توسط دستور cut و با استفاده از سوئیچ d-، کامای (ویرگول) پس از عدد را جدا و اولین ستون توسط سوئیچ f- (یعنی جدا کردن نخستین عدد از سه عدد. توجه داشته باشید در دو متغیر LOAD5MIN و LOAD15MIN عدد مقابل سویئچ f- به ترتیب برابر 2 و 3 است که معرف دومین و سومین عدد اس خروجی دستور uptime می باشد.). درنهایت خروجی حاصل از دستور cut به دستور sed ارسال شده و توسط دستور sed و فرمت استفاده شده از آن، فضای خالی پس از عدد حذف می می شود. (توجه کنید که میان اعداد یک فضای خالی است که از همان ابتدا و پس از فیلتر توسط دستور های awk و cut از میان نرفته و به ورودی دستور sed ارسال می شود) آنچه که باقی می ماند یک عدد که نشان دهنده Load Average در 1 دقیقه پیش می باشد و در متغیر LOAD1MIN ذخیره می شود.

‘LOAD1MIN=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f1 | sed ‘s/ //g

متغیر های LOAD5MIN و LOAD15MIN به ترتیب حاوی دمین و سومین عدد از سه عدد گفته شده یعنی Load Average سیستم در 5 و 15 دقیقه پیش هستند که تفسیر آنها همانند آنچه که برای متغیر LOAD1MIN گفته شد، می باشد.

‘LOAD5MIN=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f2 | sed ‘s/ //g

‘LOAD15MIN=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f3 | sed ‘s/ //g

متغیر MEMU حاوی پیامی است که اطلاعاتی از وضعیت میزلن حافظه سیستم را به مدیر امیل می کند. در دستور زیر خروجی دستور free به دستور awk فرستاده می شود و توسط awk، خطی که شامل Total است جدا شده و سپس ستون های دوم با نتغیر 2$، ستون سوم با متغیر 3$ و ستون چهارم با متغیر 4$ که پیش از آنها رشته هایی الحاق می شود، جدا می شود و در متغیر MEMU ذخیره خواهد شد. (متغیر MEMU حاوی رشته ای از وضعیت حافظه است)

“(‘{“MEMU=”$(free -tom | awk ‘/Total:/ {print “Total memory: “$2″ MB\nUsed memory: “$3″ MB\nFree memory: “$4″ MB

اگر دستوری را که در متغیر MEMU ذخیره شده است را به تهایی اجرا کنید خروجی مشابه زیر خواهید دید :

Total memory: 2019 MB

Used memory: 928 MB

Free memory: 1090 MB

متغیر SUBJECT شامل رشته subject برای ارسال ایمل است که حاوی نام هاست (hostname) و عدد متغیر های LOAD1MIN و LOAD5MIN و LOAD15MIN می باشد. بطور مثال :

“SUBJECT=”Alert $(hostname) high load average: $LOAD5MIN

متغیر RESULT یک متغیر باینری (درست/نادرست یا TRUE/FALSE) است. در این متغیر بررسی می شود که آیا LOAD5MIN از NOTIFY بیشتر است یا نه و سپس به دستور bc رفته. اگر بزرگتر بود یعنی TRUE و دستور bc آنرا به عدد 1 تبدیل می کند (1 همیشه عددی درست است) و اگر بزرگت نبود FALSE تلقی شده و به دستور bc فرستاده شده و bc آنرا 0 تبدیل می کند. (0 عددی همیشه نادرست است)

(RESULT=$(echo “$LOAD5MIN > $NOTIFY” | bc

با مجموعه کد های زیر بررسی می شود که آیا RESULT درست (TRUE است، یعنی LOAD5MIN بیشتر از NOTIFY است) و در این حالت باید یک میل به مدیر (لیست ایمل ها در متغیر MAIL) ارسال شود. متغیر SUBJECT که حاوی رشته عنوان ایمل بود، نیز استفاده شده است.

if [ "$RESULT" == "$TRUE" ]; then
# echo true
/bin/mail “$EMAIL” -s “$SUBJECT” < $TEMPFILE
fi

می توانید سورس کامل را از اینجا دانلود کنید. آنرا در مسیر usr/bin/local/ کپی کنید و با دستور unzip از حالت فشرده خارج کنید. و سپس مجوز اجرایی به آن بدهید و سپس با استفاده از crontabمثال های آن)، اسکریپت را برای اجرای خودکار زمانبندی نمایید.



برچسب ها : , , , , , , ,

به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد