آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

کنترل Job



کنترل Job

اگرچه در اسکریپت‌ها معمول نیست، اما کنترلjob در پوسته‌های محاوره‌ای بسیار با اهمیت است. کنترل Job شما را قادر می‌سازد با کارهای در حال اجرای پس‌زمینه، ارتباط متقابل داشته باشید، و jobهای در حال اجرا را معوق کنید، وغیره.

اصول نظری

در سیستم‌های job، Posixها به صورت «گروههای پردازش»، با یک پردازش سرگروه، پیاده‌سازی شده‌اند. هر tty (ترمینال) یک «گروه پردازش» منفرد در پیش‌زمینه دارد، که ارتباط محاوره‌ای با ترمینال را ممکن می‌سازد. تمام گروههای پردازشی کنترلی دیگرِ همان tty به صورت jobهای پس‌زمینه می‌باشند، و می‌توانند در حال اجرا یا تعلیق باشند.

یک job موقعی تعلیق می‌شود که پردازش سر گروه آن یکی از سیگنال‌های SIGSTOP یا SIGTSTP یا SIGTTIN یا SIGTTOU را دریافت کند. سیگنالهای SIGTTIN و SIGTTOU هر وقت که یک job پس‌زمینه سعی کند از ترمینال بخواند یا در آن بنویسد، به طور خودکار ارسال می‌شوند--- این است چرای آنکه ‎cat &‎ به جای آنکه در پس‌زمینه اجرا گردد، فوراً به حالت تعلیق می‌رود.

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

  • Ctrl-Z سیگنال SIGTSTP را به job پیش‌زمینه ارسال می‌کند(به طور معمول آنرا به تعلیق در می‌آورد)

  • Ctrl-C سیگنال SIGINT را به job پیش‌زمینه ارسال می‌کند( به طور معمول آن را خاتمه می‌دهد)

  • ‎Ctrl-\‎ سیگنال SIGQUIT را به job پیش‌زمینه ارسال می‌کند(به طور معمول موجب ایجاد یک نسخه فایل core و سپس انصراف از job می‌گردد)

شیوه عمل

کنترل Job به طور پیش‌فرض در پوسته‌های محاوره‌ای عمل می‌کنند. امکان آن هست که برای اسکریپت‌ها با دستور set -m یا set -o monitor فعال گردد.

پردازش job پیش‌زمینه با فشردن ‎ Ctrl-Z‎ می تواند به حالت تعلیق درآید. در bash هیچ راهی برای ارجاع به job پیش‌زمینه وجود ندارد: اگر job پیش‌زمینه‌ای غیر از bash وجود داشته باشد، bash در انتظار می‌ماند تا آن job خاتمه یابد، و ازاینرو نمی‌تواند هیچ کدی را اجرا نماید( حتی trapها تا خاتمه یافتن jobپیش‌زمینه به تعویق می‌افتند). بنابراین، دستورات زیر فقط برای jobهای پس‌زمینه( و تعلیق شده ) کار می‌کنند.

کنترل Job فرمانهای زیر را فعال می‌کند:

  • ‏[مشخصه job] ‏fg: یک job پس‌زمینه را به پیش‌زمینه می‌آورد.

  • ‏[... مشخصه job ] ‏bg : یک job به تعلیق درآمده را در پس‌زمینه اجرا می‌کند.

  • suspend:پوسته را به حالت تعلیق می‌برد( اکثراً برای موقعی مناسب است که پردازش والد، یک پوستهِ با کنترل job باشد).

دستورات دیگر برای محاوره با jobها عبارتند از:

  • jobs [options] [jobspec ...]‎ : این jobهای تعلیقی و پس‌زمینه را لیست می‌کند. گزینه‌ها شامل ‎-p‎(فقط شماره شناسایی پردازش را لیست می‌کند)،‎ -s‎ (فقط jobهای تعلیقی را لیست می‌کند)، و ‎-r‎ (فقط jobهای در حال اجرا در پس‌زمینه را لیست می‌کند). اگر یک یا چند مشخصه( jobspec) معین شده باشد، تمام jobهای دیگر صرفنظر می‌شوند.

  • kill می‌تواند به جای شماره شناسایی، یک مشخصه job قبول کند.

  • disown به bash می‌گوید یک job موجود را فراموش کند. این دستور bash را از ارسال خودکار سیگنال SIGHUP به پردازشهای آن job مانع می‌شود، اما همچنین به معنای آنست که دیگر نمی‌توان با jobspec به آن رجوع نمود.

بنابراین، تمام اینها به چه معناست؟ کنترل Job به شما اجازه می‌دهد در یک نشست منفرد ترمینال، امور چندگانه‌ای در حال اجرا داشته باشید. (در روزگار گذشته، زمانی که شما فقط یک ترمینال روی میز داشتید، و روشی برای ایجاد ترمینالهای مجازی جهت اضافه کردن آن نبود)، بسیار زیاد اهمیت داشت. در سیستم‌ها و سخت افزار مدرن، شما انتخاب‌های بیشتری در دسترس دارید --برای مثال می‌توانید screen یا tmux را برای به دست آوردن ترمینالهای مجازی اجرا نمایید. یا داخل یک نشست X، می‌توانید xterm یا شبیه‌سازهای ترمینال بیشتری باز کنید(و می‌توانید این دو را به خوبی باهم ترکیب کنید).

اما گاهی اوقات، یک کنترل job ساده(تعلیق یا پس‌زمینه) سودمند واقع می‌شود. شاید یک پشتیبان‌گیری را شروع کرده باشید و بیش از آنچه انتظار دارید طول بکشد. می‌توانید با Ctrl-Z آن را به تعلیق درآورید و سپس آن را با دستور bg در پس‌زمینه قرار بدهید، واعلان فرمان پوسته را بازپس بگیرید،به طوری که در ضمن اینکه پشتیبان‌گیری در پس‌زمینه انجام می‌شود، بتوانید کار دیگری در همان نشست ترمینال انجام بدهید.

مشخصات Job

مشخصه job یا "jobspec" روشی برای ارجاع به پردازشی است که job را می‌سازد. یک مشخصه می‌تواند چنین باشد:

  • %n ‎ جهت ارجاع به job شماره n.

  • %str ‎ برای ارجاع به آن job که با دستوری که رشته str در ابتدای آنست، شروع شده باشد. اگر بیش از یک job اینگونه موجود باشد، یک خطا رخ می‌دهد.

  • %?str ‎ برای ارجاع به یک job که با دستوری شامل رشته str شروع شده باشد. اگر بیش از یک job از این قبیل باشد، یک خطا رخ می‌دهد.

  • %% یا ‎%+‎ برای ارجاع به job اخیر: آنکه آخرین job شروع شده در پس‌زمینه، یا تعلیق شده در پیش‌زمینه باشد. fg و bg در صورتی که jobspec داده نشده باشد، روی این job عمل می‌کنند.

  • %-‎ برای job قبلی( که قبل از job فعلی %% بود).

امکان آن هست که یک دستور اختیاری را بایک jobspec به کار برد، این ساختار: ‎jobs -x ''cmd args...''‎. در اینصورت arg‌هایی که مشخصه job به نظر می‌آیند را با شماره شناسایی‌های سرگروه پردازشهای هر job متناظر تعویض می‌کند، سپس دستور را اجرا می‌کند. برای مثال، ‎jobs -x strace -p %%‎ فرمان strace را به job اخیر پیوست خواهد نمود(اگر به جای حالت تعلیق در حال اجرا در پس‌زمینه باشد سودمندتر است).

مطلب انتهایی، یک مشخصه job عریان می‌تواند به عنوان دستور به کار رود: ‎%1‎ معادل است با ‎ fg %1‎, در حالیکه ‎%1 &‎ معادل با‎ bg %1 ‎ می‌باشد.

See Also

مدیریت پردازش تمرین‌هایی برای کار با پردازشهای چندتایی را بحث می‌کند. یک مثال از کاربرد کنترل job در داخل اسکریپت نیز دارد.

نظرات 0 + ارسال نظر
ایمیل شما بعد از ثبت نمایش داده نخواهد شد