В Unix або Unix-подібній операційній системі керування завданнями означає керування групою процесів як завданням через оболонку.IEEE Std 1003.1-2001, Section 3.201, Job Функції керування включають призупинення, відновлення та завершення, а більш розширені функції можуть виконуватися надсиланням сигналу завданню. Керування завданнями дає змогу користувачеві керувати виконанням у Unix-середовищі багатопроцесорної обробки.
Керування завданнями вперше було реалізовано в C shell Джимом Калпом,Foreword by Bill Joy in в IIASA в Австрії, з використанням можливостей ядра 4.1BSD. Korn-shell, розроблений у Bell Labs, перейняв цю функціональність, а пізніше її було включено до версії Bourne shell у SVR4, і вона існує в більшості сучасних Unix-оболонок.
Завдання
Завдання охоплює всі процеси, які запускаються для обробки командного рядка оболонки. Простий командний рядок може запустити лише один процес, але командний рядок може призвести до запуску кількох процесів, оскільки процес може створювати дочірні процеси, а командний рядок може задавати конвеєр із кількох команд. Наприклад, наведений нижче командний рядок вибирає рядки, що містять текст «title», сортує їх в алфавітному порядку та відображає результат у пейджері термінала: grep title somefile.txt | sort | less. Це створює щонайменше три процеси: один для , один для і один для . Керування завданнями дає змогу оболонці керувати цими процесами як єдиною сутністю.
Ідентифікатор завдання
Завдання ідентифікується числовим ідентифікатором завдання, також відомим як номер завдання, який класифікується як дескриптор, оскільки є абстрактним посиланням на ресурс (групу процесів). Значення ідентифікатора з префіксом може використовуватися з командою керування завданнями для зазначення завдання. Спеціальні посилання і посилаються на типове завдання — те, яке було б вибране, якби жодне не було зазначене.IEEE Std 1003.1-2001, Section 3.203, Job Control Job ID Документація Bash називає посилання (що починається з ) специфікацією завдання (скорочено jobspec).
Значення ідентифікаторів керування завданнями зазвичай використовуються лише в інтерактивній оболонці. У сценаріях замість них використовуються значення PGID, оскільки вони є точнішими та надійнішими; справді, у сценарії bash керування завданнями за замовчуванням вимкнено.
Передній план / фон
За замовчуванням завдання виконується на передньому плані, де воно використовує інтерактивне введення та виведення. Користувач вводить командний рядок і взаємодіє з процесами, але не може виконати іншу команду, доки поточне завдання не завершиться. Багато операцій (тобто виведення списку файлів) є відносно швидкими, тому користувач може дочекатися відповіді з незначним простоєм, а деякі операції (тобто редагування) потребують взаємодії, яка можлива лише для завдання переднього плану. Але якщо взаємодія не потрібна, а операція надовго блокує доступ до оболонки, користувач може захотіти виконати її у фоні — де процеси не можуть отримувати інтерактивне введення, але користувач може виконувати інші операції переднього плану, поки фонове завдання виконується. За замовчуванням фонові завдання виводять дані до інтерактивного потоку виведення, що призводить до перемішування виведення завдань переднього плану та фонових завдань, хоча користувач може перенаправити виведення фонового завдання, щоб запобігти цьому.
Керування POSIX визначає інтерфейс користувача для керування завданнями — за зразком оболонки Korn.; . Команди зазвичай реалізуються як вбудовані команди оболонки, а не як окремі програми.
Запуск у фоні Якщо командний рядок закінчується на , завдання запускається у фоні. Призупинення завдання переднього плану Завдання переднього плану можна призупинити натисканням . У цьому стані завдання можна відновити у фоні за допомогою або відновити на передньому плані за допомогою . Команда Команда (скорочення від foreground — передній план) переміщує фонове завдання на передній план — або зазначене завдання, або, якщо завдання не зазначено, те, яке було останнім додане до фону. Коли завдання переднього плану призупинене (за допомогою ), ця команда відновлює це завдання. Команда Команда wait призупиняє інтерактивний сеанс, доки не завершаться зазначені фонові завдання, або, якщо жодного не зазначено, доки не завершаться всі фонові завдання активної оболонки. Команда Команда (скорочення від background — фон) переміщує призупинене завдання переднього плану у фон і відновлює його. Команда Команда повідомляє інформацію про кожне фонове завдання, зокрема ідентифікатор, командний рядок і стан виконання (зупинене або виконується).
Сигнали Взаємодія між процесами для керування завданнями реалізується за допомогою сигналів.
Зазвичай оболонка зберігає інформацію про фонові завдання в таблиці завдань. Коли інтерактивний сеанс завершується (тобто користувач виконує вихід із системи), оболонка надсилає сигнал SIGHUP усім завданням і чекає, доки групи процесів завершать роботу, перш ніж завершити роботу самої оболонки. Деякі оболонки надають не-POXIS команду disown, яка видаляє завдання з таблиці завдань. Група процесів стає сиротою. Оболонка не надсилатиме їй SIGHUP і не чекатиме на її завершення. Це один зі способів перетворити процес на демон, яким безпосередньо володіє кореневий процес init. Команда POSIX надає альтернативний спосіб запобігти завершенню завдання оболонкою.
Призупинення завдання переднього плану (за допомогою ) надсилає сигнал SIGTSTP (зупинка термінала) процесам у групі процесів завдання. За замовчуванням цей сигнал призводить до призупинення процесу, щоб оболонка могла відновити його. Проте процес може ігнорувати цей сигнал. Процес також може бути призупинений за допомогою сигналу SIGSTOP (зупинка), який не можна ігнорувати.
Коли користувач натискає , оболонка надсилає сигнал SIGINT (переривання) кожному процесу в групі процесів завдання переднього плану, що за замовчуванням призводить до його завершення, хоча процес може ігнорувати цей сигнал.
Коли зупинене завдання відновлюється (за допомогою або ), оболонка змінює групу процесів переднього плану сеансу керуючого термінала і відновлює завдання, надсилаючи сигнал SIGCONT усім процесам у групі процесів завдання. Якщо завдання відновлюється на передньому плані, група процесів переднього плану керуючого термінала встановлюється в групу процесів завдання; якщо завдання відновлюється у фоні, вона встановлюється в іншу групу процесів.
Фоновому процесу, який намагається читати з керувального термінала або записувати до нього, надсилається сигнал SIGTTIN (для введення) або SIGTTOU (для виведення), оскільки група процесів процесу не збігається з групою процесів переднього плану термінала. За замовчуванням ці сигнали зупиняють процес, але вони також можуть оброблятися іншими способами. Оболонки часто перевизначають стандартну дію зупинки SIGTTOU, щоб фонові процеси за замовчуванням могли виводити свої дані до керувального термінала.
Вбудована у bash команда kill (а не /bin/kill) може надсилати сигнали завданням як за ідентифікатором, так і за ідентифікатором групи процесів. Надсилання сигналу завданню надсилає його кожному процесу групи. kill може надсилати завданню будь-який сигнал; однак, якщо метою є позбутися процесів у системі, найімовірніше, найбільш доречними будуть сигнали SIGKILL і SIGTERM (за замовчуванням).
Примітки
Посилання "Job Control", Bash Reference Manual