زنده باد آلن باغومیان؛ من از همینجا مطالعهی کتاب «نصب و برپاسازی سرورهای لینوکس» تالیف استاد آلن باغومیان رو به همه دوستداران لینوکس توصیه میکنم.
داشتم دنبال کپی شل میگشتم ببینین چی پیدا کردم:
مسلم جون یادت هست گفتم برای انجام محاسبات ریاضی خروجی echo رو به bc می دادیم؟
بعدش توی کتابه دیدم expr رو معرفی کرده...
حالا این رو ببین از شیخ آلن باغومیان:
- کد: گزینش همه
echo "I am $[2003-1978] years old."
ای جان! حال کردین؟
حالا یک چیز دیگه، تا حدودی فهمیدم منظور از ./ و . چیه؟
خب میدونین مسئله سر مدیریت پروسههاست. هر پروسهای که در سیستم اجرا میشه یک کد انحصاری پروسه داره PID این کد حتی برای bash هم وجود داره.
تست کنین:
- کد: گزینش همه
ps au
در خروجی به ردیف pid توجه کنین. این کد مربوط به pid شل شماست.
حقیقت قضیه اینجاست که با اجرای هر دستوری در شل یک نسخه از شل در حافظه مجددا بارگذاری میشه و دستور در اون شل اجرا میشه. دستور ps هم از این قاعده مستثنی نیست!
بیشتر توضیح بدم؟
این دستور رو ببینین:
- کد: گزینش همه
echo $PPID
این متغییر محیطی در واقع معرف PID شل اصلی است که شلهای ما از روی آن ایجاد میشوند تا دستورات ترمینال را اجرا کنند. صحیحتر این است که بگوییم این متغییر در واقع مربوط به پروسهی شل والد است.
برای یک تمرین کوچولو حاضرین؟
دو تا پنجرهی ترمینال باز کنین. در هر دو ترمینال دستور زیر رو وارد کنین
- کد: گزینش همه
ps au
همونطور که میبینین. دو تا bash وجود داره با دو تا PID متفاوت. حالا این دستور رو بزنین:
- کد: گزینش همه
echo $PPID
در هر دو پنجره یک مقدار نشان داده میشود.
حتما با دستور کشتن پروسه آشنایی دارین:
- کد: گزینش همه
kill -9 $PPID
همونطور که دیدین. این دستور پروسهی والد bash ها رو میکشه و در نتیجه همهی پنجرههای bash یک دفعه بسته میشوند.
حالا در یک اسکریپت نمونه مثلا با اسم ppidTest این دستور رو وارد کنین
- کد: گزینش همه
#
# PPID test
#
echo $PPID
خب حالا طبق کتاب اگه یکبار این اسکریپت رو به این شکل
- کد: گزینش همه
./ppidTest
و یکبار به این شکل
- کد: گزینش همه
. ppidTest
اجرا کنین (بین نقطه و اسم اسکریپت یک کاراکتر فاصله هست).
من اینجوری نتیجه میگیرم که برای اولی مثل هر دستور دیگهای در شل یک PID فرزند از bash اصلی گرفته شده و آن فرزند، شده والد این اسکریپت بیچاره! و برای دومی اسکریپت رسما رفته پیش والد اصلی و گفته من فرزند شما هستم!
خب فکر کنم پزشکی قانونی بتونه مشکل این اسکریپت ما رو حل کنه! فقط دارم فکر میکنم اولی از این جهت بهتره که با نرم افزارهای مدیریت پروسه یا حتی ps میشه پدر اسکریپت رو پیدا کرد و به خدمتش رسید! (البته اگه لازم شد) ولی برای حالت اجرای دومی قضیه به این سادگی نخواهد بود و تاوانش سنگینتر خواهد بود. به نظر شما چه موقع باید از دومی استفاده کرد؟
راستی بچهها مواظب دامهای تازهکارها باشیم!
http://www.bash-hackers.org/wiki/doku.php/scripting/newbie_trapsنظر سنجی موافق هستین بریم گام بعدی؟