کنترل job
توسط royaflash دذ ۲۶ آبا, ۱۳۹۵ دذ ۰۲:۲۳ بعد از ظهر | دسته‌بندی شده در shell, گنو/لینوکس | با ۰ دیدگاه |771 views

کنترل Job

مانند هر سیستم عامل چند وظیفه‌ای، لینوکس چندین پردازش همزمان را اجرا می‌کند. خُب، به هر حال آنها به ظاهر همزمان هستند. در عمل، یک پردازشگر منفرد کامپیوتر تنها می‌تواند یک پردازش را در یک زمان اجرا کند اما هسته لینوکس نوبت‌دهی به هر پردازش در پردازشگر را مدیریت می‌کند و به نظر می‌آید که در یک زمان در حال اجرا شدن هستند.

چند فرمان وجود دارد که می‌توانند برای کنترل پردازشها به کار بروند. آنها عبارتند از:

  • ps – فهرست نمودن پردازشهای در حال اجرا در سیستم
  • kill – فرستادن یک سیگنال به یک یا چند پردازش ( معمولاً برای کشتن-kill- پردازش)
  • jobs – یک روش جایگزین برای لیست کردن پردازش‌های خودتان
  • bg – قرار دادن یک پردازش در پس‌زمینه
  • fg – قرار دادن یک پردازش در پیش‌زمینه

یک مثال کاربردی

در حالیکه ممکن است به نظر بیاید این مطلب نسبتاً مبهم است، برای کاربران متوسطی که بیشتر با رابط گرافیکی کاربر کار می‌کنند، می‌تواند خیلی کاربردی باشد. شما شاید این را ندانید، اما اکثر (اگر نه همه)برنامه‌های گرافیکی می‌توانند از طریق خط فرمان راه‌اندازی بشوند. این هم یک مثال: یک برنامه کوچک فراهم شده با سیستم پنجره X به نام xload وجود دارد که نموداری به نمایندگی از بارگیری سیستم نمایش می‌دهد. شما می‌توانید این برنامه را با تایپ به شرح زیر اجرا کنید:

[[email protected] me]$ xload

توجه نمایید که پنجره کوچک xload ظاهر می‌گردد و نمایش نمودار بارگیری سیستم را شروع می‌کند. همچنین توجه داشته باشید که اعلان فرمان شما بعد از راه‌اندازی برنامه دوباره ظاهر نگردید. پوسته قبل از باز گرداندن کنترل به شما، در انتظار خاتمه یافتن برنامه می‌ماند. اگر شما پنجره xload را ببندید، برنامه xload خاتمه یافته و اعلان فرمان باز می‌گردد.

قرار دادن یک برنامه در پس‌زمینه

اکنون به منظور اندکی آسان‌تر نمودن مطلب، می‌خواهیم دوباره برنامه xload را راه‌اندازی کنیم، اما این دفعه آن را در پس‌زمینه قرار خواهیم داد به طوری که اعلان فرمان برگشت داده شود. برای انجام این کار، ما xload را به این شکل اجرا می‌کنیم:

[[email protected] me]$ xload &
[۱] ۱۲۲۳

[[email protected] me]$

در این حالت، اعلان فرمان برگشت می‌شود زیرا پردازش در پس‌زمینه قرار داده شد.

اکنون تصور کنید شما استفاده از علامت & برای قرار دادن برنامه در پس‌زمینه را فراموش کردید. باز هم امید هست. شما می‌توانید ‎Ctrl-z‎ را تایپ کنید و برنامه به حالت تعلیق در خواهد آمد. پردازش هنوز وجود دارد، امابدون استفاده است. برای ادامه یافتن پردازش در پس‌زمینه، فرمان bg را تایپ کنید (کوتاه شده background). این هم یک مثال:

[[email protected] me]$ xload
[۲]+ Stopped xload

[[email protected] me]$ bg
[۲]+ xload &

فهرست پردازش‌های شما

حال که ما یک پردازش در پس‌زمینه داریم، نمایش دادن فهرستی از پردازش‌هایی که ما راه‌اندازی کرده‌ایم مفید است. برای انجام این مورد، می‌توانیم یا از فرمان jobs یا از فرمان قدرتمندتر ps استفاده کنیم.

[[email protected] me]$ jobs
[۱]+ Running xload &

[[email protected] me]$ ps
PID TTY TIME CMD
۱۲۱۱ pts/4 00:00:00 bash
۱۲۴۶ pts/4 00:00:00 xload
۱۲۴۷ pts/4 00:00:00 ps

[[email protected] me]$

کشتن یک پردازش

فرض کنید که شما یک برنامه دارید که بی توجه می‌شود، چگونه از دست آن خلاص می‌شوید؟ البته شما فرمان kill را به کار می‌برید. اجازه بدهید اثر آن روی xload را امتحان کنیم. ابتدا، نیاز دارید برنامه‌ای را که می‌خواهید بکُشید، شناسایی کنید. شما می‌توانید یا jobs یا ps را برای انجام این کار استفاده کنید. اگر jobs را به کار ببرید یک شماره job به دست می‌آورید. با فرمان ps، یک شماره شناسایی پردازش ‎(PID)‎ به شما داده می‌شود. ما با هر دو روش آن را انجام خواهیم داد:

[[email protected] me]$ xload &
[۱] ۱۲۹۲

[[email protected] me]$ jobs
[۱]+ Running xload &

[[email protected] me]$ kill %1

[[email protected] me]$ xload &
[۲] ۱۲۹۳
[۱] Terminated xload

[[email protected] me]$ ps
PID TTY TIME CMD
۱۲۸۰ pts/5 00:00:00 bash
۱۲۹۳ pts/5 00:00:00 xload
۱۲۹۴ pts/5 00:00:00 ps

[[email protected] me]$ kill 1293
[۲]+ Terminated xload

[[email protected] me]$

کمی بیشتر در باره kill

در حالیکه فرمان kill برای کشتن پردازش‌ها به کار می‌رود، هدف واقعی آن فرستادن سیگنال‌ها به پردازش‌ها است. اکثر اوقات سیگنال برای اینکه به پردازش بگوید کنار برود درنظر گرفته می‌شود، اما مواردی بیش از این برایش وجود دارد. برنامه‌ها (در صورتیکه به طور صحیح نوشته شده باشند) بیشتر مواقع به منظور میسر کردن روش کم و بیش برازنده‌ای برای خاتمه یافتن، به سیگنال‌های سیستم عامل گوش می‌کنند و به آنها پاسخ می‌دهند. برای مثال، یک ویرایشگر متن می‌تواند برای هر سیگنالی که بیانگر قطع ارتباط کاربر، یا شروع فرآیند خاموش شدن سیستم است، گوش بسپارد. موقعی که این سیگنال را دریافت می‌کند، قبل از اینکه خارج شود، کار در حال پردازش را ذخیره می‌کند. فرمان kill می‌تواند سیگنال‌های متنوعی به پردازش‌ها بفرستد. با تایپ:

    kill -l

فهرستی از سیگنال‌هایی که پشتبانی می‌شوند دریافت خواهید نمود. بیشتر آنها نسبتاً مبهم هستند، اما شناختن برخی از آنها مفید است:

شماره سیگنال نام
توضیحات
۱ SIGHUP سیگنال توقف. برنامه‌ها می‌توانند به این سیگنال گوش بسپارند و به محض شنیدن آن عمل کنند. این سیگنال موقعی که شما ترمینال را می‌بندید برای پردازشهای در حال اجرای ترمینال فرستاده می‌شود.
۲ SIGINT سیگنال وقفه. این سیگنال برای قطع کردن پردازشها به آنها داده می‌شود. برنامه‌ها می‌توانند این سیگنال را تحویل گرفته و براساس آن عمل کنند. همچنین شما می‌توانید این سیگنال را به طور مستقیم با تایپ ‎Ctrl-c‎ در پنجره ترمینال، جایی که برنامه در حال اجراست صادر کنید.
۱۵ SIGTERM سیگنال خاتمه. این سیگنال برای خاتمه دادن پردازشها به آنها داده می‌شود. دوباره، برنامه‌ها می‌توانند این سیگنال را تحویل گرفته بر اساس آن عمل کنند. این سیگنال پیش‌فرضی است که اگر سیگنالی تعیین نگردیده باشد توسط فرمان kill فرستاده می‌شود.
۹ SIGKILL سیگنال کشتن. این سیگنال باعث خاتمه یافتن فوری پردازش توسط کرنل لینوکس می‌شود. برنامه‌ها نمی‌توانند به این سیگنال گوش بسپارند.

اکنون بیایید فرض کنیم شما برنامه‌ای دارید که به طور ناامیدانه‌ای معلق می‌شود و شما می خواهید آن را مرخص کنید. اکنون کاری که شما انجام می‌‌دهید:

  1. فرمان ps را برای بدست آوردن شماره شناسایی پردازشی ‎(PID)‎ که می‌خواهید خاتمه بدهید، به کار ببرید.
  2. یک فرمان kill برای آن PID صادر کنید.
  3. اگر پردازش از خاتمه یافتن امتناع کند (یعنی از سیگنال صرفنظر کند)، سیگنالهای به طور فزاینده خشن‌تر می‌فرستید تا خاتمه یابد.

[[email protected] me]$ ps x | grep bad_program
PID TTY STAT TIME COMMAND
۲۹۳۱ pts/5 SN 0:00 bad_program

[[email protected] me]$ kill -SIGTERM 2931

[[email protected] me]$ kill -SIGKILL 2931

در مثال فوق من از فرمان ps با گزینه x برای لیست تمام پردازشهایم (حتی آنهایی که از ترمینال جاری راه‌اندازی نگردیده‌اند) استفاده کردم. بعلاوه، من خروجی فرمان ps را برای اینکه فقط برنامه‌هایی که من علاقمند بودم لیست بشوند به داخل grep لوله کشی نمودم. بعد، kill را برای صدور سیگنال SIGTERM به برنامه دردسر آفرین به کار بردم. در تجربه واقعی انجام آن به روش زیر معمول‌تر است چون سیگنال پیش‌فرض فرستاده شده توسط kill همان SIGTERM است و همچنین kill به جای نام سیگنال، می‌تواند از شماره سیگنال استفاده کند:

[[email protected] me]$ kill 2931

آنوقت، در صورتیکه پردازش خاتمه نیابد، با سیگنال SIGKILL آن را مجبور می‌کنیم:

[[email protected] me]$ kill -9 2931

درباره - یاشار اسمعیل دخت هستم ۲۷ سالمه (به دنیال یافتم آنم که کیستم)به صورت ۱۰۰٪ به گنو/لینوکس مهاجرت کردم . من رو با نام royaflash میشناسید . در زمینه شبکه و امنیت شبکه فعالیت میکنم . لینوکس همیشه چیزی برای یادگیری داره و لینوکس یه فرهنگه . در صورت نیاز میتونین با آدرس ایمیل : [email protected] یا شماره تلفن : 09141100257 در ارتباط باشید . وبلاگ شخصی من (-:) درباره من

فرستادن یک دیدگاه

XHTML: شما می‌توانید از این برچسب‌ها استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>