بیایید با استفاده از معلومات خودمان در مورد فرمانهای مدیریتی، یک اسکریپت سیستم را بررسی نماییم. یکی از کوتاهترین و سادهترین اسکریپتها برای فهمیدن، اسکریپت «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 اشتباه گردد. |