6. Запуск і обробка фонових процесів: керування завданнями

Ви напевно помітили, що після того, як ви впровадили команду в Термінал'і, вам зазвичай потрібно дочекатися завершення її роботи, перш ніж shell поверне вам керування. Це, охначає що ви запустили команду у пріорітетному режимі. Проте бувають випадки, коли це небажано.

Припустимо, наприклад, що ви вирішили рекурсивно скопіювати один великий каталог в інший. Ви також вирішили ігнорувати помилки, тому ви перенаправили потік помилок в /dev/null:

cp -R images/ /shared/ 2>/dev/null

Виконання такої команди може забрати кілька хвилин поки вона не виконається повністю. У вас є два вирішення: перший - жорстокий, що припускає зупинку (вбивство) команди, а потім повторне її виконання, але вже в більш підходящий час. Для цього натисніть Ctrl-C: при цьому процес буде завершено, а ви повернетеся назад до рядка із запрошенням. Але зачекайте, поки що не робіть цього! Читайте далі.

Припустимо, ви хочете, щоб команда виконувалася, а ви займалися чимось іншим. Рішенням буде запуск процесу у фоновому режимі. Для цього натисніть Ctrl-Z, щоб призупинити процес:

$ cp -R images/ /shared/ 2>/dev/null
# Натисніть зараз C-z
[1]+  Stopped                 cp -R images/ /shared/ 2>/dev/null
$

і ви знову в рядку із запрошенням. Процес тепер в режимі очікування, очікуючи вашої команди для його повторного запуску (як це зазначено ключовим словом Stopped). Це є саме те, що потрібно, але вже в фоновому процесі. Запровадьте bg (BackGround - фоновий) для одержання бажаного результату:

$ bg
[1]+ cp -R images/ /shared/ 2>/dev/null &
$

При цьому процес продовжить свою роботу, але вже як фонове завдання, як це зазначено знаком & (амперсанд) наприкінці рядка. Потім ви повернетеся назад у рядок із запрошенням і зможете продовжити роботу. Процес, який виконується як фонове завдання, або у фоновому режимі, називається фоновим завданням.

Звісно ви можете відразу запускати процеси як фонові завдання, додаючи знак & наприкінці команди. Наприклад, ви можете запустити команду копіювання каталогу в фоновому режимі, набравши:

$ cp -R images/ /shared/ 2>/dev/null &

Якщо хочете, ви також можете відновити цей процес у пріоритетному режим і дочекатися його завершення, набравши fg (ForeGround - пріоритетний). Щоб перевести його назад у фоновий режим, введіть таку послідовність Ctrl-Z, bg.

У такий спосіб ви можете запустити кілька завдань: кожній команді при цьому буде присвоєно номер завдання. Команда shelljobs виводить список всіх завдань, пов'язаних із поточним shell'ом. Перед завданням ставиться знак +, який означає останній процес, запущений в фоновому режимі. Для відновлення конкретного завдання в пріоритетному режим ви можете запровадити команду fg <n>, де <n> - номер завдання, наприклад, fg 5.

Зверніть увагу, що в такий спосіб ви також можете припиняти чи запускати повноекранні програми, такі як less або текстовий редактор Vi, і відновлювати їх у пріоритетному режимі, коли вам це знадобиться.