
سیستمعامل لینوکس و برنامههای آن به طور کلی بسیار پایدار هستند. با این حال، یک اسکریپت خراب یا یک فرآیند که وارد یک حلقه بیپایان میشود، میتواند منابع سیستم را به شدت مصرف کرده و باعث اختلال در عملکرد سرویسها گردد. در چنین شرایطی، با استفاده از اسکریپت Bash میتوان سرویسها را به طور خودکار ریستارت کرد و اگر این اقدامات مؤثر نبودند، سرور را به طور خودکار ریبوت کرد.
توضیح خط به خط اسکریپت
در ابتدا، متغیرهایی برای تنظیم آستانه بار سیستم و تنظیمات نوتیفیکیشن تعریف میکنیم:
NOTIFY="10" EMAIL="Your email address"
- NOTIFY: این متغیر حداکثر بار مجاز برای میانگین بار ۵ دقیقهای سیستم را تعیین میکند. اگر بار سیستم از این حد بیشتر شود، اسکریپت اقدامات اصلاحی را انجام میدهد.
- EMAIL: این متغیر آدرس ایمیل مدیر سیستم برای ارسال هشدارها را مشخص میکند.
ایجاد فایل موقت و بررسی موفقیتآمیز آن
TEMPFILE="$(mktemp)" || exit 1
در این قسمت، یک فایل موقت ایجاد میشود و اگر این فرآیند با شکست مواجه شد، اسکریپت با کد خطا خارج میشود.
استخراج میانگین بار ۵ دقیقهای
F5M="$(uptime | awk -F "load average: " '{ print $2 }' | cut -d, -f1)"
در این مرحله، با استفاده از دستور uptime
میانگین بار ۵ دقیقهای سیستم استخراج میشود.
بررسی بار سیستم و مقایسه با آستانه
RESULT=$(echo "$F5M > $NOTIFY" | bc) if [ "$RESULT" == "1" ]; then
در اینجا، بار سیستم با آستانه مشخص شده در متغیر NOTIFY مقایسه میشود. اگر بار سیستم بیشتر از آستانه باشد، اسکریپت وارد قسمتهای اصلاحی میشود.
ارسال ایمیل هشدار
mail -s "Load average crossed" "$EMAIL" < $TEMPFILE
اگر بار سیستم از آستانه عبور کرده باشد، ایمیلی به مدیر ارسال میشود که شامل جزئیات مشکل، نام میزبان و تاریخ و زمان محلی است.
توقف سرویسهای مهم
sudo systemctl stop apache2 sudo systemctl stop mysql sudo systemctl stop php8.3-fpm sleep 4
در این قسمت، سرویسهای Apache، MySQL و PHP-FPM متوقف میشوند.
بررسی وضعیت سرویسها بعد از توقف
s1="$(sudo systemctl status apache2 | grep inactive)" s2="$(sudo systemctl status mysql | grep inactive)" s3="$(sudo systemctl status php8.4-fpm | grep inactive)" echo $s1 $s2 $s3 >> $TEMPFILE
در این بخش، وضعیت هر سرویس بررسی میشود تا مطمئن شویم که همه سرویسها متوقف شدهاند. اگر هر کدام از سرویسها متوقف نشده باشد، اطلاعات مربوطه در فایل موقت ذخیره میشود و برای مدیر ارسال میشود.
اقدامات در صورت شکست توقف سرویسها
if [ "$s1" == "" ] || [ "$s2" == "" ] || [ "$s3" == "" ]; then mail -s "One of the services failed to stop -> reboot" "$EMAIL" < $TEMPFILE sleep 3 sudo reboot else mail -s "All services have been stopped" "$EMAIL" < $TEMPFILE fi
اگر هر کدام از سرویسها نتوانند متوقف شوند، به مدیر ایمیل ارسال میشود و سپس سرور ریبوت میشود. در غیر این صورت، ایمیلی ارسال میشود که نشان میدهد همه سرویسها با موفقیت متوقف شدهاند.
راهاندازی مجدد سرویسها
sudo systemctl start apache2 sudo systemctl start mysql sudo systemctl start php8.3-fpm sleep 4
در این بخش، سرویسها مجدداً راهاندازی میشوند.
بررسی وضعیت سرویسها بعد از راهاندازی مجدد
r1="$(sudo systemctl status apache2 | grep running)" r2="$(sudo systemctl status mysql | grep running)" r3="$(sudo systemctl status php8.4-fpm | grep running)"
در اینجا، وضعیت سرویسها بررسی میشود تا مطمئن شویم که همه سرویسها به درستی راهاندازی شدهاند.
اقدامات در صورت شکست راهاندازی مجدد سرویسها
if [ "$r1" == "" ] || [ "$r2" == "" ] || [ "$r3" == "" ]; then mail -s "One of the services failed to start -> reboot" "$EMAIL" < $TEMPFILE sleep 3 sudo reboot else mail -s "All services have been started" "$EMAIL" < $TEMPFILE fi
اگر یکی از سرویسها نتواند راهاندازی شود، ایمیلی به مدیر ارسال میشود و سپس سرور ریبوت میشود. در غیر این صورت، ایمیلی ارسال میشود که نشان میدهد همه سرویسها با موفقیت راهاندازی شدهاند.
پیشنهادات برای تست
قبل از استفاده از این اسکریپت در محیط تولید، پیشنهاد میکنم که آن را با یک تنظیم آستانه بار پایینتر تست کنید و به جای دستور reboot از دستور echo استفاده کنید تا از اعمال تغییرات در سیستم اصلی جلوگیری شود. این کار به شما کمک میکند تا از عملکرد صحیح اسکریپت اطمینان حاصل کنید.
نمونه اسکریپت دیگر:
هدف این اسکریپت نظارت بر سرویسها و شناسایی مشکلات احتمالی است. اگر سرویسها دچار مشکل شوند، اسکریپت به طور خودکار آنها را راهاندازی مجدد کرده و در صورتی که این کار مؤثر نباشد، سرور را ریبوت خواهد کرد.
ساخت اسکریپت Bash برای نظارت و مدیریت سرویسها
در ابتدا، باید یک اسکریپت ساده Bash بنویسید که وضعیت سرویسها را بررسی کرده و در صورت بروز مشکل، اقدامات لازم را انجام دهد. در اینجا یک نمونه اسکریپت برای این کار آورده شده است:
#!/bin/bash # سرویسهایی که باید نظارت شوند SERVICES=("apache2" "mysql" "nginx") # تابعی برای بررسی وضعیت سرویس check_service() { systemctl is-active --quiet $1 return $? } # تابعی برای راهاندازی مجدد سرویس restart_service() { systemctl restart $1 return $? } # تابعی برای ریبوت سرور reboot_server() { reboot } # بررسی وضعیت سرویسها for service in "${SERVICES[@]}"; do if ! check_service $service; then echo "$service متوقف شده است. در حال تلاش برای راهاندازی مجدد..." restart_service $service if ! check_service $service; then echo "راهاندازی مجدد $service با شکست مواجه شد. در حال ریبوت کردن سرور..." reboot_server else echo "$service با موفقیت راهاندازی شد." fi else echo "$service در حال اجراست." fi done
شرح اسکریپت:
- تعریف سرویسها: لیستی از سرویسهایی که میخواهید نظارت کنید (مانند
apache2
,mysql
,nginx
) ایجاد شده است. - توابع کمکی:
check_service
: بررسی میکند که آیا سرویس در حال اجرا است یا خیر.restart_service
: سرویس را راهاندازی مجدد میکند.reboot_server
: سرور را ریبوت میکند.
- بررسی سرویسها: برای هر سرویس در لیست، ابتدا وضعیت آن بررسی میشود. اگر سرویس متوقف شده باشد، تلاش میشود که آن را دوباره راهاندازی کرده و در صورتی که این کار موفقیتآمیز نباشد، سرور ریبوت میشود.
اجرای اسکریپت به صورت خودکار
برای اجرای این اسکریپت به طور خودکار در فواصل زمانی مشخص، میتوانید از Cron استفاده کنید. بهعنوان مثال، برای اجرای این اسکریپت هر 5 دقیقه، دستور زیر را در crontab قرار دهید:
*/5 * * * * /path/to/your/script.sh
نتیجهگیری
این اسکریپت به مدیران سیستم این امکان را میدهد که بهطور خودکار وضعیت سرویسها را نظارت کرده و در صورت بروز مشکل، آن را به سرعت رفع کنند. همچنین، در صورتی که راهاندازی مجدد سرویسها مؤثر نباشد، ریبوت سرور بهطور خودکار انجام میشود. این نوع خودکارسازی میتواند به کاهش زمان توقف سرویسها و افزایش پایداری سیستم کمک کند.