تجزیه و تحلیل یک اسکریپت سیستم

فصل ‎17‎- فرمان‌های سیستم و مدیریت

‎17.1‎- تجزیه و تحلیل یک اسکریپت سیستم

بیایید با استفاده از معلومات خودمان در مورد فرمان‌های مدیریتی، یک اسکریپت سیستم را بررسی نماییم. یکی از کوتاه‌ترین و ساده‌ترین اسکریپت‌ها برای فهمیدن، اسکریپت «killall»‏ ‎[1]‎ است که هنگام خاموش کردن سیستم برای تعلیق پردازش‌های در حال اجرا، به کار می‌رود.

مثال ‎17-12‎.‏ killall، از ‎/etc/rc.d/init.d‎

#!/bin/sh

# -->توضیحات اضافه شده نگارنده این سند به وسیله ‎# -->‎ علامت خورده‌اند.

# -->   این قسمتی از بسته اسکریپت ‎rc‎ است، نوشته شده به وسیله
# -->‎Miquel van Smoorenburg, ‎<miquels@drinkel.nl.mugnet.org>‎

# --> این اسکریپت بخصوص، به نطر می‌رسد ویژه ‎Red Hat / FC‎ باشد
# -->           (ممکن است در سایر توزیع‌ها وجود نداشته باشد).

#    پایین آوردن تمام سرویس‌های غیر لازم که هنوز در حال اجرا هستند
#+   (موردی نباید وجود داشته باشد، پس این فقط یک کنترل سلامت است)

for i in /var/lock/subsys/*; do
        # -->  حلقه ‎for/in‎ استاندارد، اما چون ‎do‎ در همان سطر
        # -->             است، اضافه‌کردن کاراکتر ‎;‎ لازم است .


        #           کنترل این که اسکریپتی در آنجا وجود دارد.
        [ ! -f $i ] && continue
        # -->   این یک استفاده چابک از «‎and list‎»، معادل با:
        # -->           ‎if [ ! -f "$i" ]; then continue‎ است.


        #                       به دست آوردن نام سیستم فرعی.
        subsys=${i#/var/lock/subsys/}
        # --> انطباق نام متغیر، که در این حالت نام فایل است.
        # -->این به طور دقیق معادل ‎subsys=`basename $i`‎ است.
	
        # -->            آن را از نام فایل قفل به دست می‌آورد
        # -->+ (اگر یک فایل قفل وجود داشته باشد، دلیل آن است
        # -->+              که پردازش در حال اجرا بوده است).
        # -->                 مدخل «lockfile» فوق را ببینید.


        #                            پایین آوردن سیستم فرعی.
        if [ -f /etc/rc.d/init.d/$subsys.init ]; then
           /etc/rc.d/init.d/$subsys.init stop
        else
           /etc/rc.d/init.d/$subsys stop
        # -->    تعلیق jobهای در حال اجرا و سرویس‌های ‎daemon‎.
        # --> توجه نمایید که «stop» یک پارامتر مکانی است، نه
        # -->+                             یک builtin پوسته.
        fi
done

آنقدر هم پیچیده نبود. گذشته از یک تدبیر کوچک ظریف و آراسته با انطباق متغیر، مورد عمده جدیدی در آن وجود ندارد.

تمرین ‎1‎.
اسکریپت halt در ‎/etc/rc.d/init.d‎ را تجزیه و تحلیل کنید . کمی طولانی‌تر از killall، اما در روش اجرا همانند آن است. یک کپی از این اسکریپت در جایی از دایرکتوری خانگی‌تان ایجاد کنید و با آن آزمایش کنید (به عنوان root آن را اجرا نکنید). یک اجرای شبیه‌سازی شده با نشانوندهای ‎-vn‎ ‏(‎sh -vn scriptname‎) انجام بدهید. توضیحات گسترده اضافه کنید. فرمان‌ها را به echo تغییر بدهید.

تمرین ‎2‎.
به برخی اسکریپت‌های پیچیده‌تر در ‎/etc/rc.d/init.d‎ نگاه کنید. برای فهمیدن لااقل قسمت‌هایی از آن ها تلاش کنید. برای تحلیل آن‌ها، از روش کار فوق پیروی کنید. برای مقداری بینش اضافی، همچنین می‌توانید فایل sysvinitfiles در دایرکتوری ‎/usr/share/doc/initscripts-?.??‎ را که بخشی از مستندات «initscripts» است، بازبینی نمایید.

یادداشت‌ها

‎[1]‎

اسکریپت سیستم killall نباید با فرمان killall در ‎/usr/bin‎ اشتباه گردد.