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

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

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

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

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

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

Безладний приклад

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

ping www.wdzwdz.com

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

Ctrl+C

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

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

ping www.wdzwdz.com
Ctrl+Z

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

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

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

jobs
ps T

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

  Як увімкнути підтримку Snap Package на Linux Mint

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

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

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

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

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

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

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Ми бачимо, що Bash має стан Ss. «S» у верхньому регістрі повідомляє нам, що оболонка Bash спляча, і її можна переривати. Як тільки це нам знадобиться, воно відповість. Нижній регістр «s» говорить нам, що оболонка є лідером сеансу.

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

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

Команда bg

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

Якщо ми запустимо команду bg, ми відновимо нашу команду ping:

bg

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

  Як перейти з Bash на C Shell в Linux

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

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

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

Команда fg

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

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

fg

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

Ctrl+C

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

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

Але, безладно чи ні, наш приклад досяг:

Переведення процесу у фоновий режим.
Відновлення процесу до запущеного стану у фоновому режимі.
Повернення процесу на перший план.
Припинення процесу.

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

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

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

  Як встановити Debian Linux

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

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

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

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

поки правда; do echo “How-To Geek Loop Process”; сон 3; зроблено &

поки правда;  робити відлуння

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

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

ls

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

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

jobs
kill %1

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

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, процесу та раптово завершує його.