پروسه چیست؟
به بخش های مختلف یک برنامه در حال اجرا یک پروسه می گن. زمانی که یک برنامه بر روی سیستم اجرا می شه، ممکنه یک یا چند پروسه ایجاد کنه. این پروسه های می تونن دستوراتی باشن که برنامه باید اجرا کنه، از یک فایلی بخاد دیتا بخونه، از کاربر بخاد یک ورودی بگیره و یا …
به طو رکلی یک پروسه در دو فضا می تونه اجرا بشه:
فضای فعلی (Foreground): این جور پروسه ها از طریق یک ترمینال اجرا و کنترل می شن. یه زبان ساده بخایم بگیم، یک کاربری باید این پروسه ها رو اجرا کنه و به صورت اتوماتیک اجرا نمی شن.
پس زمینه (Background): پروسه هایی که در پس زمینه سیستم اجرا می شن. این جور پروسه ها معمولا جروی از توابع و سرویس های سیستم عامل هستن همچنین هیچ ورودی از کاربر نمی گیرد.
ارواح سیستم (Deamons): این پروسه ها در زمان بالا اومدن سیستم اجرا می شن و تا زمانی که سیستم خاموش نشه، در حال اجرا می مونن. اینو در نظر داشته باشین که کاربرا می تونن تمامی پروسه ها رو کنترل کنن.
خوبه بدونیم که یک پروسه همیشه در چهار حالت کلی هستش:
در حال اجرا (Running): در این حالت، پروسه یا در حال اجرا هستش و یا منتظر پردازنده هستش که اجراش کنه.
در انتظار (Waiting): تو این حالت، پروسه منتظر یک منبع و یا یک اتفاقی هستش که اجرا بشه. پروسه ها در این حالت به دو دسته کلی تقسیم می شن، قابل قطع (Interruptible) و غیر قابل قطع (Uninterruptible). پروسه های قابل قطع رو می شه با فرستادن سیگنال متوقف کرد اما پروسه های غیر قابل قطع به طور مستقیم با سخت افزار در ارتباط هستن و نمی شه قطعشون کرد.
متوقف شده (Stopped): پروسه توسط یک سیگنال متوقف شده.
زامبی (Zombie): زمانی که پروسه متوقف شده اما یک تسکی هنوز بهش وصله. پروسه باید تموم مرده باشه اما هنوز گیره.
نحوه مدیریت پروسه ها در سیستم عامل لینوکس:
با استفاده از دستور زیر، شما می تونید تمام پروسه های فعالی که به کاربر مربوط هستن رو ببینید.
$ ps au
در لینوکس هر پروسه یک ID خاص داره که با اون می شه کنترل و دنبالش کرد.
برای پیدا کردن شناسه هر پروسه (Process ID)، می تونید از ابزار زیر استفاده کنید.
$ pidof systemd
توجه داشته باشید که در اکثر سیستم ها، وظیفه مدیریت پروسه ها به عهده Systemd هستش و خود این ابزار اولین پروسه ای هستش که اجرا می شه. اما میبینید که تو سیستم تستی ما init اولین پروسه هستش و قبل از Systemd بالا اومده.
$ pidof init
برای انجام تست های این مقاله ما از دستور sleep استفاده می کنیم که تا یه پروسه رو بدون انجام هیچ کاری برای یه مدتی اجرا می کنه. چون هدف یاد گیری کارهایی هستش که می تونیم با یک پروسه انجام بدیم.
زمانی که شما یک دستور رو در ترمینال می زنید، به طور کلی در فضای Foreground اجرا می شه. اگر بخاین که پروسه رو در فضای Background اجرا کنید، می تونید با وارد کردن & در آخر هر دستور، اون رو در Background اجرا کنید.
برای دیدن تمام پروسه هایی که در فضای Background وجود دارند می تونید از دستور jobs استفاده کنید.
$ sleep 100 &
$ jobs
اگر دوست داشته باشین که پروسه رو به فضای فعلی بیارید می تونید از طریق دستور زیر این کار رو انجام بدین.
$ fg %1
با وارد کردن control + z می تونید یک پروسه در حال اجرا رو متوقف کنید و به فضای Background ببرید.
با دستور زیر می تونید یک پروسه ای که در فضای Background متوقف هستش رو می تونید همونجا اجرا کنید.
برای دیدن اطلاعات تمامی پروسه هایی که بر روی سیستم در حال اجرا هست می تونید از دستور زیر استفاده کنید.
این دستور به صورت لایو وضعیت تمام پروسه هاتونو نشون می ده.
$ top
شما می تونید با استفاده از دستور زیر شماره id یک پروسه رو به دست بیارید.
$ pgrep sleep
با استفاده از دستور زیر می تونید id یک پروسه که در فضای یک کاربر دیگه در حال اجرا هستش رو ببیند.
$ pgrep -u root bash
با استفاده از دستور زیر می تونید سیگنال متوقف شدن رو برای یک پروسه ارسال کنید.
$ kill -9 4794
به صورت زیر می تونید لیست سیگنال هایی رو که می تونید به یک پروسه ارسال کرد رو ببینید.
$ kill -l