پردازهها، کارهای ترمینال و مصرف منابع
در این درس ۵ بخش
سناریو: ترمینال منتظر چه چیزی است؟
فرمانی اجرا کردهاید و اعلان ترمینال برنمیگردد. آیا سیستم خراب شده، برنامه هنوز کار میکند یا فقط منتظر است؟ برای پاسخ باید پردازه و منابع را بشناسید. برنامه فایلی است که امکان اجرا دارد؛ پردازه یا process نمونهٔ در حال اجرای آن است. چند پنجره از یک برنامه میتوانند چند پردازه ایجاد کنند. هر پردازه یک شناسهٔ عددی به نام PID دارد. این شماره در هر بار اجرا ممکن است فرق کند و پس از پایان پردازه بعدها دوباره استفاده شود؛ شمارهٔ مثالهای آموزشی را کورکورانه وارد نکنید.
ps
ps -u "$USER" -o pid,comm
topps تصویری از پردازهها در همان لحظه میدهد. فرمان اول معمولاً پردازههای مربوط به کاربر و ترمینال فعلی را نشان میدهد؛ فرمان دوم پردازههای کاربر فعلی را با ستون شناسه و نام برنامه فهرست میکند. top مرتب صفحه را تازه میکند و مصرف پردازنده و حافظه را کنار اطلاعات کلی سیستم نشان میدهد. برای خروج از top کلید q را بزنید. اعداد با گذشت زمان تغییر میکنند؛ یک نمونهٔ کوتاه برای تشخیص قطعی علت کندی کافی نیست. در این تمرین فقط مشاهده کنید و از گزینههای تغییر یا پایاندادن پردازهها در top استفاده نکنید.
فرمان پیشزمینه ترمینال را در اختیار میگیرد تا تمام شود یا متوقفش کنید. برای تجربه، فرمان زیر را اجرا کنید؛ sleep سی ثانیه منتظر میماند و معمولاً خروجی ندارد. پیش از پایان انتظار، Ctrl+C را بزنید؛ یعنی Ctrl را نگه دارید و C را فشار دهید. معمولاً پیام ^C و سپس اعلان شل را میبینید. این میانبر درخواست وقفه را به کارِ پیشزمینه میفرستد. بیخروجیبودن sleep طبیعی است و نشانهٔ خرابی نیست.
sleep 30یک کار پسزمینهٔ متعلق به خودتان
علامت & در انتهای دستور، آن را در پسزمینه شروع میکند و اعلان شل زودتر برمیگردد. Bash این اجرا را یک job مینامد. شمارهٔ job فقط در همان شل معنا دارد؛ PID شناسهٔ پردازه در سیستم است. jobs همهٔ پردازههای رایانه را نشان نمیدهد، بلکه کارهای شل فعلی را میبیند. دستورهای بعدی را پشت سر هم در همان پنجرهٔ Bash اجرا کنید. ما فقط یک sleep آزمایشی میسازیم و شناسهٔ دقیق همان اجرا را در متغیر practice_pid نگه میداریم.
sleep 300 &
practice_pid=$!
printf 'Practice PID: %s\n' "$practice_pid"
ps -p "$practice_pid" -o pid,comm
jobs -lمتغیر ویژهٔ $! شناسهٔ آخرین پردازهٔ پسزمینهٔ آغازشده را میدهد. در خروجی ps باید همان عدد و نام sleep را ببینید. jobs -l نیز شمارهای داخل کروشه، وضعیت و PID را نشان میدهد؛ این عددها ثابت نیستند. اگر بیش از پنج دقیقه گذشته باشد، sleep خودش تمام شده است. در آن حالت آزمایش را از ابتدا بسازید و شناسهٔ قبلی را برای دستور بعدی به کار نبرید. هیچ شناسهای از پردازههای دیگر انتخاب نکنید؛ هدف این تمرین آشنایی با کنترل همان کارِ ساختهشده است.
kill -TERM "$practice_pid"
wait "$practice_pid"
jobs -l
unset practice_pidاین بخش را بلافاصله پس از مشاهدهٔ sleep اجرا کنید. kill نامی تاریخی دارد؛ در واقع سیگنال میفرستد. TERM درخواست پایان است و به برنامه امکان رسیدگی و جمعکردن کارها را میدهد، هرچند همهٔ برنامهها الزاماً یکسان پاسخ نمیدهند. wait تا پایان همان فرزند شل صبر میکند؛ برای sleep پایانیافته با سیگنال ممکن است پیام Terminated و وضعیت خروج غیرصفر دیده شود. پس از پایان، آن کار دیگر در فهرست فعال jobs نیست. پایان اجباری با سیگنال KILL فرصت رسیدگی نمیدهد و راهحل پیشفرض درس نیست؛ برای این آزمایش لازم نیست.
دیسک با حافظه فرق دارد
df -h .
du -sh .
free -hاین فرمانها را در یک پوشهٔ کوچک تمرینی اجرا کنید. df ظرفیت و فضای مصرفشدهٔ فایلسیستمی را میدهد که پوشهٔ فعلی روی آن است. du مصرف فضای فایلهای همین پوشه و زیرپوشهها را برآورد میکند؛ گزینهٔ s یک جمع و h واحدهای خواناتر میدهد. این دو عدد قرار نیست یکسان باشند. free وضعیت RAM و فضای کمکی swap را نشان میدهد. ستون available برآورد مفیدتری برای آغاز برنامههای تازه است؛ لینوکس از RAM برای کش هم استفاده میکند، پس کوچکبودن free بهتنهایی اثبات کمبود حافظه نیست.
تمرین و پاسخ توضیحی
تمرین: فقط روی sleep خودتان آزمایش پسزمینه و پایان را انجام دهید. سپس بگویید برای فهمیدن فضای خالی دیسک از کدام فرمان استفاده میکنید و آیا PID و شمارهٔ job یک چیزند. پاسخ: df -h . فضای فایلسیستم را گزارش میکند؛ free دربارهٔ حافظه است و du اندازهٔ مجموعهٔ فایلها را برآورد میکند. PID شناسهٔ پردازه و شمارهٔ job مرجع شل فعلی است. اگر jobs پس از آزمایش خالی شد، تنها میدانیم شل فعلی دیگر آن کار فعال را ندارد؛ این نتیجه دربارهٔ نبودن همهٔ پردازههای سیستم نیست.
منابع رسمی و مطالعهٔ تکمیلی
https://manpages.debian.org/trixie/procps/ps.1.en.html
https://manpages.debian.org/trixie/procps/top.1.en.html
https://www.gnu.org/s/bash/manual/html_node/Job-Control-Basics.html
https://www.gnu.org/software/bash/manual/html_node/Job-Control-Builtins.html
https://www.gnu.org/s/bash/manual/html_node/Signals.html
https://www.gnu.org/s/coreutils/manual/html_node/df-invocation.html
تألیف و مثالهای اختصاصی: تحریریه درسآوند. منابع انگلیسی برای بررسی مفاهیم و مطالعهٔ تکمیلی معرفی شدهاند.
متن درسهای عمومی را بدون ورود بخوانید.