Job control — interaktiv shell foydalanuvchisiga buyruqlar va pipeline’larni oldingi yoki fon rejimida ishga tushirish, vaqtincha to‘xtatish va davom ettirish imkonini beradigan Unix jarayon boshqaruvi mexanizmidir. Shell bitta vazifa tarkibidagi jarayonlarni process groupga birlashtiradi va terminal qaysi guruh bilan faol ishlashini nazorat qiladi.
Process group va session
Pipeline’dagi a | b | c jarayonlari odatda bitta process group ID oladi. Shell ularni bitta job sifatida ko‘rsatadi. Session bir yoki bir nechta process groupni birlashtiradi; interaktiv shell odatda session leader bo‘lib, controlling terminalga ega.
Terminalda ayni paytda bitta foreground process group bo‘ladi. Klaviaturadan kiritilgan belgilar shu guruhga yetadi. Fon guruh terminaldan o‘qishga urinsa SIGTTIN, ayrim terminal sozlamasida yozsa SIGTTOU olishi mumkin. Bu fon ishning interaktiv dastur bilan aralashishini cheklaydi.
Signallar
Foydalanuvchi Ctrl+C bosganda terminal driver foreground guruhga SIGINT, Ctrl+Zda SIGTSTP yuboradi. Signal faqat pipeline’dagi bitta jarayonga emas, butun process groupga boradi. Jarayon signalni default usulda qabul qilishi, handler o‘rnatishi yoki ayrim signalni bloklashi mumkin.
To‘xtagan job bg bilan fonda, fg bilan foregroundda SIGCONT orqali davom ettiriladi. jobs shell yuritayotgan vazifalar ro‘yxatini, %1 kabi jobspec esa aniq jobni bildiradi. Job ID operatsion tizim PIDsi emas, shellning lokal identifikatoridir.
Shell mas’uliyati
Shell forkdan keyin race condition bo‘lmasligi uchun process groupni ehtiyotkor o‘rnatadi, terminal foreground guruhini tcsetpgrp bilan almashtiradi va job holatini waitpid orqali kuzatadi. Pipeline tugasa yoki to‘xtasa, terminal nazorati shell guruhiga qaytariladi.
Shellning o‘zi terminal job-control signallarini boshqaradi, aks holda terminalni fon jarayonga berish paytida to‘xtab qolishi mumkin. Child jarayonda signal maskasi va default handlerlar bajariladigan dastur uchun tiklanadi.
Fon jarayon va sessiya
Buyruq oxiridagi & shellni kutmasdan promptga qaytaradi, ammo jarayon hali shell sessioniga bog‘liq. Terminal yopilganda SIGHUP kelishi yoki chiqish kanali uzilishi mumkin. nohup, terminal multiplexer yoki service manager uzoq ishlaydigan vazifani interaktiv sessiyadan ajratadi.
Daemon yaratish uchun oddiy & yetarli emas. Production xizmatning restart, log, environment, dependency va privilege boshqaruvi systemd kabi supervisor orqali qilinadi. Job control foydalanuvchi sessiyasi qulayligi uchun, service management esa tizim xizmatining hayot sikli uchun mo‘ljallangan.
Amaliy chet holatlar
Pipeline’dagi jarayonlardan biri to‘xtab, boshqalari ishlashda davom etishi mumkin; shell job holatini guruh a’zolarining barchasidan yig‘adi. disown shellning job jadvalidan vazifani chiqarishi yoki SIGHUP yubormaslikni belgilashi mumkin, ammo dastur stdoutni yopilgan terminalga yozsa baribir xato oladi. SSH sessiya uzilganda masofadagi jarayon taqdiri server, pseudo-terminal va shell sozlamasiga bog‘liq. Uzoq hisoblash uchun tmux, screen yoki scheduler natijani ishonchliroq saqlaydi. Skriptda interaktiv job control odatda o‘chiq; background PIDni saqlash va wait bilan status olish aniqroq.
Bir nechta fon vazifasi parallel ishlasa, har birining exit statusi yig‘iladi va muvaffaqiyatsizlik yashirilmaydi. Trap shutdown signalini bolalariga uzatib, ularni kutadi. Faqat parentni tugatish orphan jarayon va tugallanmagan fayl qoldirishi mumkin. Pipeline statusi shell sozlamasiga ko‘ra oxirgi buyruq yoki birinchi xato bilan aniqlanadi.
Bog‘liq tushunchalar
Shell, Process group, Session, Controlling terminal, Unix signal, Service manager