Як запускати і контролювати фонові процеси в Linux

Як запускати і контролювати фонові процеси в Linux

Використовуйте оболонку Bash у Linux для керування пріоритетними та фоновими процесами. Ви можете використовувати функції і сигнали керування завданнями Bash, щоб забезпечити більшу гнучкість при виконанні команд. Ми покажемо вам, як.


Все про процеси

Кожен раз, коли програма виконується в Linux або Unix-подібній операційній системі, процес запускається. «Процес» - це ім'я для внутрішнього представлення виконуваної програми в пам'яті комп'ютера. Існує процес для кожної активної програми. Насправді, є процес майже для всього, що працює на вашому комп'ютері. Це включає компоненти вашого графічного середовища стільниці (GDE), такі як GNOME або KDE, і системні демони, які запускаються під час запуску.

Чому майже все, що працює? Що ж, вбудовані модулі Bash, такі як cd, pwd і alias, не обов'язково повинні запускати процес (або «викликати») при запуску. Bash виконує ці команди в екземплярі оболонки Bash, який працює у вікні вашого термінала. Ці команди бувають швидкими саме тому, що для їх виконання не потрібен запуск процесу. (Ви можете ввести help у вікні термінала, щоб побачити список вбудованих команд Bash.)

Процеси можуть виконуватися на передньому плані, і в цьому випадку вони захоплюють ваш термінал до тих пір, поки вони не завершаться, або вони можуть виконуватися у фоновому режимі. Процеси, які виконуються у фоновому режимі, не домінують у вікні термінала, і ви можете продовжувати працювати в нім. або, принаймні, вони не домінують у вікні термінала, якщо вони не генерують виведення на екран.

Брудний приклад

Ми запустимо просте трасування ping. Ми збираємося пропінгувати домен How-To Geek. Це буде виконано як пріоритетний процес.

пінг www.. com

Отримуємо очікувані результати, прокручуючи вікно терміналу вниз. Ми не можемо більше нічого робити у вікні терміналу, поки працює ping. Щоб завершити команду, натисніть Ctrl + C

Ctrl + C,

Видимий ефект Ctrl + C виділено на скріншоті. ping дає коротке резюме, а потім зупиняється.

Давайте повторимо це. Але цього разу ми натиснемо Ctrl + Z замість Ctrl + C Завдання не буде завершено. Це стане фоновим завданням. Ми отримуємо контроль над поверненим нам вікном терміналу.

пінг www.. com

Ctrl + Z

Видимий ефект натискання Ctrl + Z виділено на скріншоті.

Цього разу нам сказали, що процес зупинено. Зупинено не означає припинено. Це як машина біля знака зупинки. Ми не списали його і не викинули. Це все ще в дорозі, нерухомо, чекаючи, щоб піти. Процес тепер є фоновою роботою.

Команда jobs показує список завдань, які було запущено в поточному сеансі термінала. І оскільки завдання (неминуче) є процесами, ми також можемо використовувати команду ps для їх перегляду. Давайте використовувати обидві команди і порівняємо їх результати. Ми будемо використовувати параметр T (термінал), щоб перераховувати тільки процеси, запущені в цьому вікні термінала. Зауважте, що немає потреби використовувати дефіс - з параметром T

роботи

Тихоокеанський стандартний час

Команда jobs говорить нам:

  • [1]: число у квадратних дужках є номером завдання. Ми можемо використовувати це для посилання на завдання, коли нам потрібно керувати ним за допомогою команд управління завданнями.
  • +: Знак плюс + показує, що це завдання буде виконано, якщо ми будемо використовувати команду управління завданнями без певного номера завдання. Це називається типовим завданням. Типовим завданням завжди є останнє додане до списку завдань.
  • Зупинено: процес не запущено.
  • ping www..com: командний рядок, який запустив процес.

Команда ps повідомляє нам:

  • PID: ідентифікатор процесу. Кожен процес має унікальний ідентифікатор.
  • TTY: псевдо-телетайп (вікно терміналу), з якого було виконано процес.
  • STAT: статус процесу.
  • ЧАС: кількість процесорного часу, що споживається процесом.
  • КОМАНДА: команда, яка запустила процес.

Це загальні значення для стовпчика STAT:

  • D: Безперервний сон. Процес знаходиться в стані очікування, зазвичай в очікуванні введення або виведення, і не може бути перерваний.
  • Я: холостий
  • R: Біг.
  • S: уривчастий сон.
  • T: зупинений сигналом управління завданням.
  • Z: процес зомбі. Процес був перерваний, але не був «очищений» його батьківським процесом.

За значенням у стовпчику STAT може слідувати один з наступних додаткових індикаторів:

  • <: Високопріоритетне завдання (не підходить для інших процесів).
  • N: Низький пріоритет (добре для інших процесів).
  • L: у процесу є сторінки, заблоковані в пам'яті (зазвичай використовувані процесами в реальному часі).
  • s: лідер сесії. Лідер сеансу - це процес, який запустив групи процесів. Оболонка є лідером сесії.
  • l: багатопоточний процес.
  • +: Процес переднього плану.

Ми можемо бачити, що Bash має стан Ss. Заголовна буква «S» говорить нам, що оболонка Bash спить, і вона переривається. Як тільки нам це знадобиться, він відповість. Рядкові літери «s» кажуть нам, що оболонка є лідером сеансу.

Команда ping має стан T Це говорить нам про те, що ping був зупинений сигналом управління завданням. У цьому прикладі це були Ctrl + Z ми використовували, щоб помістити його в фон.

Команда ps T має стан R, який означає виконання. Знак + вказує, що цей процес є членом групи переднього плану. Таким чином, команда ps T виконується на передньому плані.

Команда bg

Команда bg використовується для відновлення тла. Може використовуватися з номером роботи або без неї. Якщо ви використовуєте його без номеру завдання, типове завдання буде показано на передній план. Процес як і раніше працює у фоновому режимі. Ви не можете відправити якісь входи в нього.

Якщо ми введемо команду bg, ми відновимо нашу команду ping:

Б.Г.

Команда ping відновлюється, і ми знову бачимо результат прокрутки у вікні терміналу. Назва команди, яку було перезапущено, буде показано для вас. Це виділено на скріншоті.

Але у нас є проблема. Завдання виконується у фоновому режимі і не буде приймати ввід. Так як же нам це зупинити? Ctrl + C нічого не робить. Ми можемо бачити це, коли набираємо його, але фонова задача не отримує цих натискань клавіш, тому вона продовжує весело пінгувати.

Насправді, ми зараз перебуваємо в дивному змішаному режимі. Ми можемо друкувати у вікні терміналу, але те, що ми друкуємо, швидко змітається прокруткою, що виводиться командою ping. Все, що ми друкуємо, діє на передньому краї.

Щоб зупинити наше фонове завдання, нам потрібно вивести його на передній план, а потім зупинити.

Команда fg

Команда fg виведе фонову задачу на передній план. Як і команда bg, її можна використовувати з номером завдання або без нього. Використання його з номером роботи означає, що він буде працювати на певній роботі. Якщо він використовується без номера завдання, використовується остання команда, надіслана у фоновому режимі.

Якщо ми введемо fg наша команда ping буде виведена на передній план. Введені нами символи змішуються з виводом команди ping, але вони обробляються оболонкою, як якщо б вони були введені в командному рядку, як зазвичай. І насправді, з точки зору оболонки Bash, саме це і сталося.

фг

І тепер, коли у нас знову запущена команда ping на передньому плані, ми можемо використовувати Ctrl + C щоб вбити її.

Ctrl + C,

Нам потрібно відправити правильні сигнали

Це було не зовсім красиво. Очевидно, що виконання процесу у фоновому режимі працює найкраще, коли процес не робить висновок і не вимагає введення.

Але, брудний чи ні, наш приклад зробив:

  • Покласти процес на задній план.
  • Відновлення процесу в робочому стані у фоновому режимі.
  • Повернення процесу на передній план.
  • Завершення процесу.

Якщо ви використовуєте Ctrl + C і Ctrl + Z, ви надсилаєте сигнали процесу. Це скорочені способи використання команди kill. Є 64 різні сигнали, які може надіслати kill. Використовуйте kill -l у командному рядку, щоб їх перелічити. kill не єдине джерело цих сигналів. Деякі з них автоматично створюються іншими процесами в системі.

Ось деякі з найбільш часто використовуваних.

  • SIGHUP: Сигнал 1. Автоматично надсилається процесу, коли термінал, в якому він запущений, закритий.
  • SIGINT: Сигнал 2. Надіслано процесу, який ви натиснули Ctrl + C Процес перервано і наказано припинити.
  • SIGQUIT: Сигнал 3. Надсилається у процес, якщо користувач надсилає сигнал виходу Ctrl + D
  • СІГКІЛЛ: Сигнал 9. Процес негайно припиняється і не буде намагатися закритися повністю. Процес не йде витончено.
  • SIGTERM: Сигнал 15. Це типовий сигнал, який надсилається командою kill. Це стандартний сигнал завершення програми.
  • SIGTSTP: Сигнал 20. Відправляється у процес, коли ви використовуєте Ctrl + Z Він зупиняє процес і поміщає його у фоновий режим.

Ми повинні використовувати команду kill для видачі сигналів, яким не призначені комбінації клавіш.

Подальший контроль роботи

Процес, переміщений в тло за допомогою Ctrl + Z переводиться в стан зупинки. Ми повинні використовувати команду bg щоб знову запустити її. Запустити програму як працюючий фоновий процес нескладно. Додайте амперсанд до кінця командного рядка.

Хоча краще, щоб фонові процеси не записували у вікно терміналу, ми будемо використовувати приклади, які це роблять. Нам потрібно мати щось на скріншотах, до яких ми можемо звернутися. Ця команда запустить нескінченний цикл як фоновий процес:

поки правда; зробити відлуння «How-To Geek Loop Process»; спати 3; & зроблено

Нам повідомляють номер завдання та ідентифікатор процесу ID процесу. Наш номер завдання - 1, а ідентифікатор процесу - 1979. Ми можемо використовувати ці ідентифікатори для управління процесом.

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

Ls

Щоб зупинити наш процес, ми можемо використовувати jobs, щоб нагадати собі, який номер завдання, а потім використовувати kill.

jobs повідомляє, що наш процес - завдання номер 1. Щоб використовувати це число з kill ми повинні поставити перед ним знак відсотка%.

роботи

вбити% 1

kill надсилає сигнал SIGTERM, сигнал номер 15, процесу, і він завершується. Після наступного натискання клавіші Enter буде показано стан роботи. Він перераховує процес як «завершений». Якщо процес не відповідає на команду kill ви можете взяти його на сходинку вище. Використовуйте команду kill з SIGKILL, сигнал № 9. Просто помістіть цифру 9 між командою kill номер завдання.

вбити 9% 1

Речі, які ми покрили

  • Ctrl + C: надсилає сигнал SIGINT, сигнал 2, процесу - якщо він приймає ввід - і говорить йому завершитися.
  • Ctrl + D: Надсилає сигнал SISQUIT 3 процесу, якщо він приймає введення, і каже йому вийти.
  • Ctrl + Z: відправляє SIGSTP, сигнал 20, процесу і говорить йому зупинитися (призупинити) і стати фоновим процесом.
  • jobs: перелічує фонові завдання і показує їх номер.
  • bg job_number: перезапускає фоновий процес. Якщо ви не надасте номер завдання, використовується останній процес, який було перетворено на фонове завдання.
  • fg job_number: виводить фоновий процес на передній план і перезапускає його. Якщо ви не надасте номер завдання, використовується останній процес, який було перетворено на фонове завдання.
  • Командний рядок &: Додавання амперсанда & до кінця командного рядка виконує цю команду як фонову задачу, яка виконується.
  • kill% job_number: надсилає сигнал SIGTERM, сигнал 15, процесу, щоб завершити його.
  • kill 9 % job_number: надсилає сигнал SIGKILL, сигнал 9, процесу і перериває його.
logo

Follow us