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

شل اسکریپت برای بررسی وضعیت یک سرویس و فعال کردن آن

در این مطلب یک شل اسکریپت برای بررسی وضعیت یک سرویس گفته می شود. شل اسکریپت از طریق دستور ps چک می کند که آیا یک سرویس مورد نظر در حال حاظر در حال اجرا است یا خیر و اگر سرویس غیر فعال بود آنرا start می کند. شل اسکریپت از طریق crontab زمانبندی می شود تا خودکار اجرا شود.

فرض کنید می خواهید یک سرویس مانند sshd را بررسی کنید که آیا در حال اجرا است یا خیر. در این مطلب یک شل برای بررسی فعال بودن یک سرویس گفته شده است. در این شل اسکریپت در صورتی که سرویس غیر فعال باشد یک ایمیل به مدیر ارسال می شود. اما در شل اسکریپتی که در این مطلب گفته می شود اگر سرویس غیر فعال باشد، بنابراین آنرا فعال یا Start می کند.

#!/bin/bash
service=replace_me_with_a_valid_service

if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
echo "$service is running!!!"
else
/etc/init.d/$service start
fi

دستور ۱

در خط دوم باید نام سرویس را در متغیر service ذخیره کنید. بهتر است مسیر کامل محل ذخیره سازی سرویس را در متغیر service ذخیره کنید. در خط چهارم دستور زیر درون یک ساختار شرطی if بررسی می شود.

ps -ef | grep -v grep | grep $service | wc -l

دستور ۲

ابتدا دستور ps -ef لیست کاملی از سرویس ها و فرایندها را بدست می آورد. سپس خروجی به دستور grep -v grep می رود و با استفاده از این دستور خطی که شامل فرایند یا بهتر بگوییم، خطی که شامل کلمه grep باشد از لیست خروجی تصفیه یا پاک سازی می شود. سپس مجدد لیست تمامی فرایندهای در حال اجرا به جز خطی که کلمه grep در آن بود، به دومین دستور grep می رود. در نهایت از لیست تصفیه شده ای که به دومین دستور grep پاس داده شده است فقط خط هایی حدا می شوند که نام سرویس در آنها باشد. در نهایت تعداد این خط ها توسط دستور wc -l شمرده می شوند.

سپس ساختار شرطی if بررسی می کند که آیا تعداد خطوط بدست آمده بیشتر از صفر است یا نه؟ اگر تعداد یک یا بیشتر از یکی باشد شرط حلقه درست است و دستور echo چاپ می شود. ولی اگر تعداد صفر بود به این معنی است که سرویس غیر فعال است و سپس دستور بعد از else ، برای فعال کردن آن اجرا می شود.

به این دلیل از دستور grep -v grep استفاده می کنیم، چون وقتی خود دستور grep را اجرا می کنیم یک فرایند به لیست فرایندهای در حال اجرا اضافه می شود. فرض کنید دستور ۲ را به صورت زیر نوشته باشیم.

ps ax | grep sshd

دستور ۳

بنابراین یک خط اضافی به صورت دومین خط  در خروجی ۱ اضافه می شود که خطی اضافی است و هیچ ارتباطی به بررسی فعال بودن سرویس مورد نظر ندارد.

696 ?        Ss     0:00 /usr/bin/sshd -D
11987 pts/2    S+     0:00 grep sshd

خروجی ۱

خط اول از خروجی ۱ نشان می دهد که سرویس sshd فعال است و دومین خط نیز اضافی چاپ شده است. فرض کنید سرویس فعال نباشد، بنابراین در خروجی ۱ نباید اولین خط ظاهر شود، ولی بازهم حتما دومین خط ظاهر می شود. در این وضعیت و مطابق دستور ۲، دستور wc -l یک خط را پیدا می کند و عدد ۱ به عنوان خروجی خواهد بود و چون ۱ بزرگتر از صفر است، بنابراین شرط حلقه درست است و در نهایت اینگونه تصور می شود که سرویس فعال بوده است. در صورتی که سرویس فعال نبوده و این اشتباه به خاطر خط اضافی است که در خروجی ps ظاهر می شود.

بنابراین پس از آنکه دستور ps -ef خروجی را به دستور grep -v grep ارسال می کند، grep -v grep خطی که شامل کلمه grep است را از لیست فرایندها پاک می کند. به عبارتی یک خط را که شامل عبارت grep است را از لیست Exclude می کند. در نهایت یک لیست تصفیه شده را به grep دوم ارسال می کند. دقت کنید که حتما اول باید grep -v grep نوشته شود، چون هدف آن این است که اول لیست فرایندهای فعال ارسال شده توسط ps را تصفیه یا پاک سازی کنیم و سپس آنرا به دستور grep دوم ارسال کنیم.

منبع شل اسکریپت



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