خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

کنترل Job

کنترل Job

در درس قبل، ما به برخی ضرورت‌های جانبیِ چند کاربری بودن لینوکس نگاه کردیم. در این درس، ماهیت چند وظیفه‌ای لینوکس و چگونگی اداره کردن آن با رابط خط فرمان را رسیدگی می‌کنیم.

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

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

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

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

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

[me@linuxbox me]$ xload

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

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

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

[me@linuxbox me]$ xload &
[1] 1223

[me@linuxbox me]$

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

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

[me@linuxbox me]$ xload
[2]+ Stopped xload

[me@linuxbox me]$ bg
[2]+ xload &

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

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

[me@linuxbox me]$ jobs
[1]+ Running xload &

[me@linuxbox me]$ ps
PID TTY TIME CMD
1211 pts/4 00:00:00 bash
1246 pts/4 00:00:00 xload
1247 pts/4 00:00:00 ps

[me@linuxbox me]$

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

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

[me@linuxbox me]$ xload &
[1] 1292

[me@linuxbox me]$ jobs
[1]+ Running xload &

[me@linuxbox me]$ kill %1

[me@linuxbox me]$ xload &
[2] 1293
[1] Terminated xload

[me@linuxbox me]$ ps
PID TTY TIME CMD
1280 pts/5 00:00:00 bash
1293 pts/5 00:00:00 xload
1294 pts/5 00:00:00 ps

[me@linuxbox me]$ kill 1293
[2]+ Terminated xload

[me@linuxbox me]$

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

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

    kill -l

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

شماره سیگنال

نام

توضیحات

1 SIGHUP

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

2 SIGINT

سیگنال وقفه. این سیگنال برای قطع کردن پردازشها به آنها داده می‌شود. برنامه‌ها می‌توانند این سیگنال را تحویل گرفته و براساس آن عمل کنند. همچنین شما می‌توانید این سیگنال را به طور مستقیم با تایپ ‎Ctrl-c‎ در پنجره ترمینال، جایی که برنامه در حال اجراست صادر کنید.

15 SIGTERM

سیگنال خاتمه. این سیگنال برای خاتمه دادن پردازشها به آنها داده می‌شود. دوباره، برنامه‌ها می‌توانند این سیگنال را تحویل گرفته بر اساس آن عمل کنند. این سیگنال پیش‌فرضی است که اگر سیگنالی تعیین نگردیده باشد توسط فرمان kill فرستاده می‌شود.

9 SIGKILL

سیگنال کشتن. این سیگنال باعث خاتمه یافتن فوری پردازش توسط کرنل لینوکس می‌شود. برنامه‌ها نمی‌توانند به این سیگنال گوش بسپارند.

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

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

[me@linuxbox me]$ ps x | grep bad_program
PID TTY STAT TIME COMMAND
2931 pts/5 SN 0:00 bad_program

[me@linuxbox me]$ kill -SIGTERM 2931

[me@linuxbox me]$ kill -SIGKILL 2931

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

[me@linuxbox me]$ kill 2931

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

[me@linuxbox me]$ kill -9 2931

کفایت می‌کند!

به این ترتیب سری درسهای « آموزش پوسته» به پایان می‌رسد. در سری بعد، «نوشتن اسکریپت‌های پوسته»، به چگونگی خودکارسازی وظایف توسط پوسته می‌پردازیم.