اگرچه در اسکریپتها معمول نیست، اما کنترل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
پردازش 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های تعلیقی و پسزمینه را لیست میکند. گزینهها شامل
kill میتواند به جای شماره شناسایی، یک مشخصه job قبول کند.
disown به bash میگوید یک job موجود را فراموش کند. این دستور bash را از ارسال خودکار سیگنال SIGHUP به پردازشهای آن job مانع میشود، اما همچنین به معنای آنست که دیگر نمیتوان با jobspec به آن رجوع نمود.
بنابراین، تمام اینها به چه معناست؟ کنترل Job به شما اجازه میدهد در یک نشست منفرد ترمینال، امور چندگانهای در حال اجرا داشته باشید. (در روزگار گذشته، زمانی که شما فقط یک ترمینال روی میز داشتید، و روشی برای ایجاد ترمینالهای مجازی جهت اضافه کردن آن نبود)، بسیار زیاد اهمیت داشت. در سیستمها و سخت افزار مدرن، شما انتخابهای بیشتری در دسترس دارید --برای مثال میتوانید screen یا tmux را برای به دست آوردن ترمینالهای مجازی اجرا نمایید. یا داخل یک نشست X، میتوانید xterm یا شبیهسازهای ترمینال بیشتری باز کنید(و میتوانید این دو را به خوبی باهم ترکیب کنید).
اما گاهی اوقات، یک کنترل job ساده(تعلیق یا پسزمینه) سودمند واقع میشود. شاید یک پشتیبانگیری را شروع کرده باشید و بیش از آنچه انتظار دارید طول بکشد. میتوانید با Ctrl-Z آن را به تعلیق درآورید و سپس آن را با دستور bg در پسزمینه قرار بدهید، واعلان فرمان پوسته را بازپس بگیرید،به طوری که در ضمن اینکه پشتیبانگیری در پسزمینه انجام میشود، بتوانید کار دیگری در همان نشست ترمینال انجام بدهید.
مشخصه job یا "jobspec" روشی برای ارجاع به پردازشی است که job را میسازد. یک مشخصه میتواند چنین باشد:
امکان آن هست که یک دستور اختیاری را بایک jobspec به کار برد، این ساختار: jobs
مطلب انتهایی، یک مشخصه job عریان میتواند به عنوان دستور به کار رود: %1 معادل است با fg
مدیریت پردازش تمرینهایی برای کار با پردازشهای چندتایی را بحث میکند. یک مثال از کاربرد کنترل job در داخل اسکریپت نیز دارد.