Зупинити процес linux. Вбиваємо процеси в Linux - команди ps, kill та killall. Завершити процес у Linux - команди kill і killall

💖 Подобається?Поділися з друзями посиланням

Аргумент -9 (або KILL) для команди kill слід використовувати в POSIX-сумісних системах лише у разі нагальної потреби. Чому? Сигнал KILL не може бути оброблений процесом. Це означає, що після завершення процесу за допомогою kill -9 дочірні процеси залишаться в пам'яті і стануть «осиротілими» (orphaned), файлова системавиявиться засмічена тимчасовими файлами, сегменти пам'яті, що спільно використовується - активними, сокети - завислими, а функція atexit(3) взагалі не буде виконана. В результаті є ризик зіткнутися з несподіваними та складними для налагодження проблемами.

Натомість використовуйте дефолтний сигнал TERM , а KILL - тільки якщо менш проблемні сигнали виявляться неефективними:

$ kill 6738
$ kill -INT 6738
$ kill -HUP 6738
$ kill -KILL 6738

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

Використання kill -KILL за умовчанням допустимо під час роботи з проблематичним додатком, наприклад, старі версії Netscape часто завершувалися лише з допомогою сигналу KILL . Однак, це рідкісний виняток із правила: використовуйте KILL для цих заздалегідь відомих програм і тільки для них.

Проблеми, що виникають при завершенні процесів

Послідовне надсилання різних сигналів може викликати такі проблеми: по-перше, процесу можуть знадобитися секунди, або навіть десятки секунд для коректного завершення. Один продукт, яким мені доводилося користуватися, вимагав понад 30 секунд для правильного завершення після отримання сигналу TERM. На щастя, ця особливість була виявлена ​​під час тестування, тому для цього випадку було написано відповідний скрипт. По-друге, іноді бувають ситуації, коли старий процес завершився, тоді як новий процес зайняв його ID у проміжку між сигналами TERM та KILL. Особливо цьому ризику наражаються системи з підвищеною «плинністю» процесів та системи, де ядро ​​призначає PID у випадковому порядку, наприклад, OpenBSD. Перевірка імені процесу або його PPID не завжди допомагає, тому що новий процес може бути форком того ж батька та мати таке ж ім'я, тому особливо параноїдальні скрипти можуть також перевіряти час створення процесу або інші метадані перед відправкою сигналу. Можливо, ці ситуації виникають рідко, але з ними варто рахуватися, якщо доводиться мати справу з критичним процесом.

Сигнали завершення процесу

Сигнали завершення процесу можуть позначатися на ім'я або порядковий номер: kill -1 і kill -HUP еквівалентні. Однак, використання імені сигналу безпечніше, оскільки при вказівці аргументу -1 легко опечататися, відправивши сигнал іншому процесу або навіть групі процесів. Також завжди намагайтеся використовувати ім'я в скриптах, тому що це допоможе краще зрозуміти який тип сигналу відправляється тому, хто читатиме ваш код.

Сигнал HUP "підвішує" шелл, тому це гарний спосібочистити шелл, який завис в очікуванні введення, або закрити SSH-сесію.

Більш детальна інформація про сигнали завершення процесів вказана в

Сигнали – програмні переривання. Вони використовуються для зв'язку між процесами в UNIX і UNIX-подібних операційних системах, таких як Linux, Mac OS.

Сигнали використовувалися ще з Bell Labs UNIX у 1970 і сьогодні офіційно визначено стандартом POSIX. Коли сигнал надходить на процес, операційна система перериває нормальний потік виконання процесу та забезпечує повідомлення.

Не має значення, яку операційну системуви використовуєте, ви безсумнівно зіткнетеся з тим, що ваші програми, блокуються і відмовитися працювати належним чином. У Unix, Linux, є команда "kill", яку ви можете використовувати, щоб припинити процес негайно, але і не тільки це, але про це трохи пізніше я розповім. У цій статті "Команда kill в Unix/Linux" я розповім і покажу на готових прикладах різні командиутиліти kill.

Команди kill та сигнали

Коли ви виконуєте команду «kill», ви насправді посилаєте сигнал до системи і даєте вказівку розірвати роботу некоректної роботи програми. Існує в цілому 60 сигналів, які можна використовувати, але все, що ви дійсно повинні знати, SIGTERM (15) та SIGKILL (9).

Ви можете переглянути всі сигнали за допомогою команди:

# kill -l

На моїй MacOS:

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

Основні сигнали

Наступні сигнали є частиною стандарту POSIX. Кожен сигнал макрос, визначений у Файл заголовку системи. Вони, як правило, скорочені, без їхнього SIG-префікса; наприклад, SIGHUP часто називають просто як HUP.

SIGTERM– Цей сигнал запитує зупинку процесу, який працює. Цей сигнал може бути проігнорований. Процесу дається час, щоб добре вимкнувся. Коли програма добре вимикається, це означає, що їй дано час, щоб урятувати його прогрес та звільнити ресурси. Іншими словами, він не «forced» припинення роботи процесу.

SIGKILL– сигнал SIGKILL змушує процес припинити виконання своєї роботи негайно. Програма не може ігнорувати цей сигнал. Незбережений прогрес буде втрачено.

Синтаксис для "kill".

Синтаксис команди такий:

# kill PID(s)

# kill [-s] [-l] %pid

Стандартний сигнал (якщо він не вказаний) є SIGTERM. Коли цей сигнал не допомагає і не працює, ви можете використовувати наступні опції для kill щоб завершити процес примусово:

# kill SIGKILL PID

# kill -9 PID

де "-9" - це прапор відноситься до сигналу SIGKILL.

Якщо ви не знаєте який потрібно використовувати PID програми якого слід позбутися, то запустіть команду:

$ ps -aux

А якщо знаєте конкретну програму (наприклад apache), то можна відсіяти непотрібну і вивести всі процеси по даній службі:

$ps-aux | grep apache

І це відобразить усі запущені програми разом з його PID(ами).

Наприклад, щоб убити програму, я виконайте таку команду:

# kill -9 3629

Варто також зазначити, що ви можете використовувати кілька процесів одночасно, щоб їх можна було «вбити»:

# kill -9 PID1 PID2 PID 3

Перезавантажити конфігураційні файлиабо перезапуск утиліт:

# kill -1 number_of_PID

Особливо корисними сигнали включають HUP, INT, kill, STOP, CONT, та 0.

Варіанти такі:

-s signal_name
Символічне ім'я сигналу, що задає сигнал для надсилання сигналу за промовчанням.

-l
Якщо операнд не вказано, показати імена сигналів; Інакше написати назву сигналу, що відповідає exit_status.

-signal_name
Символічне ім'я сигналу, що задає сигнал для надсилання TERM за замовчуванням.

-signal_number
Невід'ємне десяткове ціле, що задає сигнал для відправки до TERM за замовчуванням.

Наступні PID-и мають особливе значення:
-1 Якщо суперкористувач, то транслює сигнал усім процесам; в іншому випадку мовить на всі процеси belong-
ing для користувача.

Деякі з сигналів, що найчастіше використовуються:

  • 1 HUP (hang up) – повісити.
  • 2 INT (interrupt) - переривання.
  • 3 QUIT (quit) – вихід.
  • 6 ABRT (abort) - переривання.
  • 9 КІЛЬ
  • 14 ALRM ( alarm clock) - Будильник.
  • 15 TERM (software termination signal) Програмне забезпеченнядля припинення сигналу.

PKill

Команда pkill дозволяє використовувати розширені шаблони регулярних виразів та інших критеріїв відповідності. Замість використання PID, тепер ви можете убити програму, ввівши ім'я процесу. Наприклад, щоб вбити браузер Firefox, просто запустіть команду:

# pkill Firefox

Оскільки він відповідає шаблону регулярного вираження, ви також можете ввести частину імені процесу, наприклад:

# pkill fire

Щоб уникнути "вбивства" неправильних процесів, ви можете зробити "pgrep -l [ім'я_процесу]" до списку відповідних процесів.

Pkill команда має набагато більше варіантів, наприклад, якщо вказати опцію «-u», то вона дозволить вам вказати ім'я користувача або ID. У цьому прикладі ми надсилаємо сигнал TERM всім процесам, що належать користувачеві 'nobody':

# pkill -u nobody

Killall

Killall використовує ім'я процесу, а замість PID, і він «вбиває» всі екземпляри процесу з тим самим ім'ям. Наприклад, якщо ви використовуєте кілька екземплярів браузера Firefox, ви можете вбити їх усіх за допомогою команди:

# killall firefox

У Gnome ви можете перезапустити Nautilus за допомогою команди:

# killall nautilus

xkill

Xkill є графічним способом"вбити" додаток. При введенні «XKill» у терміналі курсор миші буде негайно стати «хрест». Все, що вам потрібно зробити, це натиснути «хрест» на провинилися додаток і він уб'є додаток миттєво. Якщо ви зацікавлені, ви можете додати клавіші, щоб увімкнути XKill.

Ще сигнали які використовуються

SIGABRT

Цей сигнал посилає сигнал процесу, щоб перервати операцію. ABRT як правило, спрямований на сам процес, коли він викликає функцію abort() мови програмування, щоб сигналізувати аварійне завершення, але він може бути спрямований з будь-якого процесу, як і будь-який інший сигнал.

SIGALRM, SIGVTALRM та SIGPROF

ALRM, VTALRM та/або сигнал PROF відправляється процесу, коли ліміт часу, вказаний при виклику функції сигналізації (наприклад, setitimer) спливає.

ALRM

Посилається, коли час або годинник з часом.

VTALRM

Посилається, коли процесорний час, що використовується у процесі, закінчиться.

PROF

Посилається, коли процесорний час, що використовується процесом, і системи від імені процесу спливає.

SIGBUS

BUS сигнал надсилає процесу, коли це призводить до помилки шини. Умови, що призводять до цього сигналу, наприклад, неправильне вирівнювання доступу до пам'яті або відсутність фізичної адреси.

SIGCHLD

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

SIGCONT

Сигнал CONT інструктує операційну систему, і дає сигнал перезапустити процес, який раніше був припинений в режимі СТОП або сигналу TSTP. Однією з найважливіших особливостей цього сигналу є контроль роботи в оболонці Unix.

SIGFPE

Сигнал FPE посилає процесу, коли він виконує помилкове, арифметичні спрацьовування, наприклад, такі як поділ на нуль.

SIGHUP

Сигнал HUP посилає процесу, коли його термінал, що управляє, закритий. Спочатку він був розроблений, щоб повідомити процес після послідовного падіння лінії (HUP відповідальний за "зависання"). У сучасних системахЦей сигнал зазвичай означає, що контроль псевдо або віртуальним терміналом був закритий.

SIGILL

ILL сигнал, що надсилається процесу при спробі виконати шкідливі, невідомі або привілейовані команди (інструкції).

SIGINT

Сигнал INT посилає процесу від термінала, що управляє, коли користувач бажає перервати процес. Це зазвичай ініціюється натисканням Control-C, але на деяких системах, delete або break.

SIGKILL

Сигнал KILL посилає процесу, щоб він негайно припинив роботу. На відміну від SIGTERM і SIGINT цей сигнал не може бути захоплений або проігнорований і процес, що приймає, не може виконати будь-які очищення після отримання цього сигналу.

SIGPIPE

Сигнал PIPE надсилається процесу, коли він намагається записати в трубі без процесу, підключеного до іншого кінця.

SIGQUIT

QUIT сигнал посилається процесу з його керуючого терміналу, коли користувач запитує процес виконання дампа.

SIGSEGV

Сигнал SEGV відправляється в процес, коли він робить неприпустиме посилання на віртуальну пам'ять або збій сегментації, тобто коли він виконує порушення сегментації.

SIGSTOP

STOP сигнал вказує ОС, щоб зупинити процес подальшого відновлення.

SIGTERM

Сигнал TERM надсилається в процес, щоб запитати про його припинення. На відміну від сигналу «kill», він може бути інтерпретованим або ігнорованим у процесі. Це дозволяє процесу виконувати «nice» виконання для припинення вивільнення ресурсів та збереження стану у разі потреби. Слід зазначити, що SIGINT майже ідентичний SIGTERM.

SIGTSTP

Сигнал TSTP надсилається в процес його керуючого терміналу і говорить йому, що потрібно тимчасово призупинити. Це зазвичай ініціюється користувачем, натиснувши Control-Z. На відміну від SIGSTOP, цей процес може зареєструвати обробник сигналу або ігнорувати сигнал.

SIGTTIN та SIGTTOU

У TTIN і TTOU сигнали надсилаються процесу, коли він намагається прочитати або записати відповідно (tty) терміналу на задньому плані. Як правило, цей сигнал може бути отриманий тільки за допомогою процесів, що знаходяться під контролем робочої панелі; демони не мають керуючі термінали і ніколи не повинні отримувати цей сигнал.

SIGUSR1 та SIGUSR2

Сигнали USR1 та USR2 відправляються процесу та вказують певні користувачем умови.

SIGPOLL

Сигнал POLL відправляється у процесі, коли відбувається асинхронна подія введення/виведення.

SIGSYS

Сигнал SYS відправляється у процесі, коли він пропускає поганий аргумент для системного виклику.

SIGTRAP

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

SIGURG

Сигнал URG відправляється процесу, коли socket має термінові або поза діапазон даних, доступних для читання.

SIGXCPU

Сигнал XCPU відправляється в процесі, коли він використовує центральний процесор протягом часу, що перевищує певне задане значення, встановленим користувачем. Прибуття сигналу XCPU забезпечує процес швидко зберегти всі проміжні результати і завершитися добре, перш ніж він завершиться операційної системи за допомогою сигналу SIGKILL.

SIGXFSZ

Сигнал XFSZ відправляється у процесі, коли файл виростає (перевищує задане значення), ніж максимально допустиме значення.

SIGRTMIN до SIGRTMAX

Сигнали RTMIN - RTMAX призначені для використання в цілях користувача. Вони сигнали реального часу.

Різні сигнали

Наступні сигнали не стандартизовані POSIX, але іноді використовуються на деяких системах.

SIGEMT

Сигнал ЕМТ відправляється у процесі, коли відбувається переривання емулятора.

SIGINFO

Сигнал INFO відправляється в процесі, коли запит статусу отримано від терміналу, що управляє.

SIGPWR

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

SIGLOST

LOST сигнал посилається до процесу, коли "file lock" втрачається.

SIGWINCH

Сигнал WINCH відправляється в процесі, коли його термінал, що управляє, змінює свій розмір.

Надсилання сигналів з клавіатури

Сигнали можна надіслати з клавіатури. Декілька стандартних значень за замовчуванням наведено нижче. За промовчанням клавіш для надсилання сигналів переривання може бути визначений за допомогою команди stty.

CTRL-C

Надіслати SIGINT (переривання). За замовчуванням це викликає процес припинення.

CTRL-Z

Надіслати SIGTSTP (Suspend). За замовчуванням це викликає процес припинення всіх операцій.

CTRL-\

Надіслати SIGQUIT (Quit). За умовчанням це викликає процес припинити негайно та скинути ядро.

CTRL-T

Надіслати SIGINFO (INFO). За замовчуванням це змушує операційну систему відображати інформацію про команду. Не підтримується усім системах.

висновок

Коли програми поводяться неправильно і викликають зависання системи, це дуже привабливо, щоб перезавантажити комп'ютер і почати сеанс знову і знову. За допомогою цих команд «kill», ви зможете краще керувати поганою поведінкою додатків, які викликають або можуть викликати крах системи. На цьому, я завершую цю тему «Команда kill у Unix/Linux».

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

Кожен процес у Linuxмає свій ідентифікатор, званий PID. Перед тим, як виконати зупинку процесу, потрібно визначити його PID. Суть полягає в тому, що нам необхідно знайти цей ідентифікатор, відкриємо наприклад будь-яку програму і спробуємо знайти її ідентифікатор.

Ідентифікатор завислого процесу

Для пошуку нам знадобляться команди ps та grep. Команда ps— виведе для нас список активних процесів у системі та інформації про них, а команда grep— виконуватиме пошук за результатами команди ps. Отже відкриємо термінал ( ctrl+alt+t) і подивимося на активні процеси

ps axu

Як ви вже встигли помітити список дуже великий і гортати його для пошуку потрібного нам процесу — зайва трата часу, для цього ми скористаємося чудовою програмою grep. Щоб визначити потрібний нам процес необхідно після введення grep вказати додаток, який ми шукаємо. На прикладі Viber це виглядає так:

ps axu | grep viber pol 22685 0.0 1.9 647748 76620 ? Sl 13:01 0:04 /usr/bin/python /usr/bin/viberwrapper-indicator pol 22697 3.0 5.4 5402084 216120 ? Sl 13:01 4:52 /opt/viber/Viber pol 24068 0.0 0.0 17192 2216 pts/0 S+ 15:41 0:00 grep --color=auto viber

У першому рядку запущений додаток viberwrapper-indicator, про цю програму можна почитати . Другий рядок безпосередньо сам Viber, який ми і будемо сьогодні «гасити», але що ж за третій рядок? Третій процес це сам процес grep, тому що як параметр пошуку ми вказали слово viber, і grep знайшов сам себе у виведенні команди ps.

Є ще один простіший спосіб дізнатися PIDпроцесу - це команда pidofяка приймає в якості параметра назву процесу і виводить його PID. Будьте уважні до регістру, якщо назва процесу починається з великої літери, а ви напишете його з маленької (або навпаки), то pidof його не буде

pidof Viber

Як ви вже встигли помітити мені видало 3 рядки з активним додатком Viber

Завершення процесу або простіше кажучи «Вбивство»

Тепер нам став відомим ідентифікатор процесу Viber і ми маємо можливість його «Вбити»:

kill 22697

Взагалі команда kill призначена посилки сигналу процесу. За замовчуванням, якщо ми не вказуємо ніяких атрибутів, надсилається сигнал SIGTERM (від слова termination - завершення). SIGTERM вказує на те, що необхідно завершитися. Кожен сигнал має власний номер. SIGTERM має номер 15. Список усіх сигналів (та їх номерів), які може надіслати команда kill, можна вивести, виконавши kill -l. Щоб надіслати сигнал SIGKILL (він має номер 9) процесу 22697, виконайте в командному рядку:

kill -9 22697

Сигнал SIGTERM може і не зупинити процес (наприклад, при перехопленні або блокуванні сигналу), SIGKILL виконує знищення процесу завжди, так як його не можна перехопити або проігнорувати.
Подивитись повний списокатрибутів можна, виконавши команду

kill -l

Завдання та процеси

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

/home/larry# ps PID TT STAT TIME COMMAND 24 3 S 0:03 (bash) 161 3 R 0:00 ps /home/larry#

Зверніть увагу, що за замовчуванням команда psвиводить список тільки тих процесів, які належать користувачу, що запустив її. Щоб подивитися всі процеси, що виконуються в системі, потрібно подати команду ps -a . Номери процесів(process ID, або PID ), вказані у першій колонці, є унікальними номерами, які система присвоює кожному працюючому процесу. Остання колонка, під назвою COMMAND, вказує ім'я працюючої команди. В даному випадку в списку вказані процеси, які запустив сам користувач larry. У системі працює ще багато інших процесів, їхній повний список можна переглянути командою ps-aux. Однак серед команд, запущених користувачем larry, є тільки bash (командна оболонка для користувача larry) і сама команда ps. Видно, що оболонка bash працює одночасно з командою ps. Коли користувач ввів команду ps, оболонка bash почала її виконувати. Після того, як команда psзакінчила свою роботу (таблиця процесів виведена на екран), управління повертається процесу bash. Тоді оболонка bash виводить на екран запрошення і чекає на нову команду.

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

У більшості випадків користувачі запускають лише одне завдання – це буде та команда, яку вони ввели останньою у командній оболонці. Однак багато командних оболонок (включаючи bash і tcsh) мають функції управління завданнями(job control), що дозволяють запускати одночасно кілька команд або завдань(jobs) і, при необхідності, перемикатися між ними.

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

Передній план та фоновий режим

Завдання можуть бути або на передньому плані(foreground), або фоновими(Background). На передньому плані у будь-який час може бути лише одне завдання. Завдання на передньому плані - це завдання, з яким ви взаємодієте; воно отримує введення з клавіатури і посилає виведення на екран (якщо, зрозуміло, ви не перенаправили введення або виведення кудись ще). Навпаки, фонові завданняне одержують введення з терміналу; як правило, такі завдання не потребують взаємодії з користувачем.

Деякі завдання виконуються дуже довго, і під час їхньої роботи не відбувається нічого цікавого. Приклад таких завдань - компілювання програм, а також стиснення великих файлів. Немає жодних причин дивитися на екран і чекати, коли ці завдання виконуються. Такі завдання слід запускати у фоновому режимі. У цей час ви можете працювати з іншими програмами.

Для керування виконанням процесів у Linux передбачено механізм передачі сигналів. Сигнал – це здатність процесів обмінюватися стандартними короткими повідомленнями безпосередньо за допомогою системи. Повідомлення-сигнал не містить жодної інформації, крім номера сигналу (для зручності замість номера можна використовувати визначене системою ім'я). Для того щоб передати сигнал, процесу достатньо задіяти системний виклик kill(), А для того, щоб прийняти сигнал, не потрібно нічого. Якщо процесу потрібно якось по-особливому реагувати на сигнал, він може зареєструвати обробника якщо обробника немає, за нього відреагує система. Як правило, це призводить до негайного завершення процесу, який отримав сигнал. Обробник сигналу запускається асинхронно, негайно після отримання сигналу, щоб процес у цей час не робив.

Два сигнали – номер 9 ( KILL) та 19 ( STOP) - Завжди обробляє система. Перший потрібний для того, щоб убити процес напевно (звідси і назва). Сигнал STOP зупиняє процес: в такому стані процес не видаляється з таблиці процесів, але і не виконується до тих пір, поки не отримає сигнал 18 ( CONT) - після чого продовжить роботу. У командній оболонці Linux сигнал STOPможна передати активному процесу за допомогою керуючої послідовності Ctrl -Z .

Сигнал номер 15 ( TERM) служить для переривання роботи завдання. При перериванні(Interrupt) завдання процес гине. Переривання завдань зазвичай здійснюється керуючою послідовністю Ctrl -C. Відновити перерване завдання неможливо. Слід також знати, деякі програми перехоплюють сигнал TERM(за допомогою оброблювача), так що натискання комбінації клавіш Ctrl -C(о) може не перервати процес негайно. Це зроблено для того, щоб програма могла знищити сліди своєї роботи, перш ніж вона буде завершена. Насправді, деякі програми взагалі не можна перервати в такий спосіб.

Переведення у фоновий режим та знищення завдань

Почнемо з простого прикладу. Розглянемо команду yes, яка на перший погляд може здатися марною. Ця команда посилає нескінченний потік рядків, що складаються із символу y на стандартний висновок. Подивимося, як працює ця команда:

/home/larry# yes y y y y y

Послідовність таких рядків продовжуватиметься нескінченно. Знищити цей процес можна, відправивши йому сигнал переривання, тобто натиснувши Ctrl -C. Вчинимо тепер інакше. Щоб на екран не виводилася ця нескінченна послідовність, перенаправимо стандартний висновок команди yes на /dev/null . Як ви, можливо, знаєте, пристрій /dev/null діє як «чорна діра»: всі дані, надіслані в цей пристрій, зникають. За допомогою цього пристрою дуже зручно позбавлятися занадто багато висновку деяких програм.

/home/larry# yes > /dev/null

Тепер на екран нічого не виводиться. Проте запрошення командної оболонки також повертається. Це відбувається тому, що команда yes все ще працює і надсилає свої повідомлення, що складаються з літер y на /dev/null . Знищити це завдання також можна, відправивши йому сигнал переривання.

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

Один спосіб перевести процес у фоновий режим – приписати символ & до кінця команди. Приклад:

/home/larry# yes > /dev/null & + 164 /home/larry#

Повідомлення є номер завдання(job number) для yes. Командна оболонка присвоює номер завдання кожному завдання, що виконується. Оскільки yes є єдиним завданням, що виконується, йому присвоюється номер 1. Число 164 є ідентифікаційним номером, відповідним даному процесу (PID ), і цей номер також дано процесу системою. Як ми побачимо далі, до процесу можна звертатися, вказуючи обидва ці номери.

Отже, тепер у нас є процес команди yes, що працює у фоні, і безперервно посилає потік з літер y на пристрій /dev/null. Для того, щоб дізнатися про статус цього процесу, потрібно виконати команду jobsяка є внутрішньою командою оболонки.

/home/larry# jobs + Running yes >/dev/null & /home/larry#

Ми бачимо, що ця програма справді працює. Для того, щоб дізнатися про статус завдання, можна також скористатися командою psЯк це було показано вище.

Для того, щоб передати процесу сигнал (найчастіше виникає потреба перерватироботу завдання) використовується утиліта kill. Як аргумент цієї команді дається або номер завдання, або PID . Необов'язковий параметр – номер сигналу, який потрібно відправити процесу. За замовчуванням надсилається сигнал TERM. У цьому випадку номер завдання був 1, так що команда kill %1перерве роботу завдання. Коли до завдання звертаються за номером (а не PID ), тоді перед цим номером в командному рядкупотрібно поставити символ відсотка («%»).

Тепер введемо команду jobsзнову, щоб перевірити результат попередньої дії:

/home/larry# jobs Terminated yes >/dev/null

Фактично завдання знищено, і при введенні команди jobs наступного разу на екрані про нього не буде жодної інформації.

Знищити завдання можна також, використовуючи ідентифікаційний номер процесу (PID). Цей номер поряд з ідентифікаційним номером завдання вказується під час старту завдання. У нашому прикладі значення PID було 164, тому команда kill 164була б еквівалентна команді kill %1. При використанні PID як аргумент команди kill вводити символ «%» не потрібно.

Призупинення та продовження роботи завдань

Запустимо спочатку процес командою yes на передньому плані, як це робилося раніше:

/home/larry# yes > /dev/null

Як і раніше, оскільки процес працює на передньому плані, запрошення командної оболонки на екран не повертається.

Тепер замість перервати завдання комбінацією клавіш Ctrl -C, завдання можна призупинити(Suspend, буквально - підвісити), відправивши йому сигнал STOP. Для припинення завдання треба натиснути відповідну комбінацію клавіш, зазвичай це Ctrl -Z .

/home/larry# yes > /dev/null Ctrl -Z+ Stopped yes >/dev/null /home/larry#

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

Для відновлення виконання завдання на передньому плані можна використати команду fg(Від слова foreground - передній план).

/home/larry# fg yes >/dev/null

Командна оболонка ще раз виведе на екран назву команди, так що користувач знатиме, яке саме завдання він у Наразізапустив на передньому плані Припинимо це завдання ще раз натисканням клавіш Ctrl -Zале цього разу запустимо його у фоновий режим командою bg(Від слова background - фон). Це призведе до того, що цей процес буде працювати так, якби при його запуску використовувалася команда з символом & в кінці (як це робилося в попередньому розділі):

/home/larry# bg + yes $>$/dev/null & /home/larry#

У цьому запрошення командної оболонки повертається. Зараз команда jobsмає показувати, що процес yesдійсно зараз працює; цей процес можна знищити командою killяк це робилося раніше.

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

Між завданнями у фоновому режимі та зупиненими завданнями є велика різниця. Зупинене завдання не працює – на нього не витрачаються обчислювальні потужності процесора. Це завдання не виконує жодних дій. Зупинене завдання займає деякий обсяг оперативної пам'яті комп'ютера, через деякий час ядро ​​відкачає цю частину пам'яті жорсткий диск « до вимоги». Навпаки, завдання у фоновому режимі виконується, використовує пам'ять і здійснює деякі дії, які, можливо, вам потрібні, але ви можете працювати з іншими програмами.

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

/home/larry# yes &

Тут стандартний висновок не був перенаправлений на пристрій /dev/null, тому на екран виводиться нескінченний потік символів y. Цей потік неможливо буде зупинити, оскільки комбінація клавіш Ctrl -Cне впливає на завдання у фоновому режимі. Для того, щоб зупинити цю видачу, треба використовувати команду fg, яка переведе завдання на передній план, а потім знищити завдання комбінацією клавіш Ctrl -C .

Зробимо ще одне зауваження. Зазвичай командою fgта командою bgвпливають на ті завдання, які були припинені останніми (ці завдання будуть позначені символом + поруч із номером завдання, якщо ввести команду jobs). Якщо в той же час працює одне або кілька завдань, завдання можна поміщати на передній план або у фоновий режим, задаючи як аргументи команди fgабо команди bgїхній ідентифікаційний номер (job ID). Наприклад, команда fg %2поміщає завдання номер 2 на передній план, а команда bg %3поміщає завдання номер 3 у фоновий режим. Використовувати PID як аргументи команд fgі bgне можна.

Більше того, для перекладу завдання на передній план можна вказати його номер. Так, команда %2 буде еквівалентна команді fg %2 .

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



Розповісти друзям