Інколи, єдиним виходом з ситуації є завершення процесу. Хоча термін “знищення” звучить досить різко, насправді він означає лише “примусове завершення” роботи процесу. Розглянемо, як це зробити за допомогою командного рядка в Linux або macOS.
Що таке процес?
Процеси – це запущені програми, такі як ваш веб-переглядач, фонові операції, що забезпечують роботу графічного інтерфейсу, а також системні служби Linux.
Можна поділити процеси на дві основні групи:
- Процеси переднього плану: це програми, які були ініційовані безпосередньо користувачем. Вони можуть працювати у вікні термінала або мати графічний інтерфейс.
- Фонові процеси: ці процеси запускаються автоматично і не вимагають взаємодії з користувачем. Вони не очікують введення даних і не відображають результатів. До таких процесів належать різні служби та демони.
Якщо розглядати процеси переднього плану як акторів на сцені, то фонові процеси – це “залаштункова” команда.
Проблеми з процесами виникають, коли вони починають споживати надмірну кількість ресурсів процесора, оперативної пам’яті, або зависають, не реагуючи на дії користувача. Графічні додатки можуть перестати реагувати на кліки миші, а термінальні програми можуть не повертати командний рядок.
“Гуманне” завершення процесу
Поняття “знищення” процесу фактично означає “примусове завершення” його роботи, що може знадобитися, якщо процес не відповідає.
У Linux існують команди kill
, pkill
та killall
, які дозволяють завершувати процеси. Ці команди працюють з будь-яким типом процесу: графічними, командним рядком, фоновими чи переднього плану.
Команда kill
Для використання kill
, необхідно знати ідентифікатор процесу (PID), який потрібно завершити. Щоб знайти PID, можна скористатися командою ps
.
Для перегляду всіх запущених процесів, застосуйте параметр -e
(всі процеси) до команди ps
. Вивід команди краще перенаправити через less
, оскільки його буде багато. Введіть: ps -e | less
та натисніть Enter.
ps -e | less
Ви побачите перелік процесів. Для пошуку в less
використовуйте клавішу /
(пошук вперед) та клавішу ?
(пошук назад).
Для фільтрації виводу команди ps
, можна перенаправити його через grep
, вказавши назву (або частину назви) процесу.
ps -e | grep shutter
Після того, як ви знайшли PID потрібного процесу, передайте його команді kill
як аргумент. Наприклад, для завершення процесу shutter
з попереднього прикладу, команда буде такою:
kill 2099
Команда kill
– це “тихий вбивця”, вона не видає ніякого зворотного зв’язку, якщо процес був успішно завершений.
Команда pkill
Команда pkill
дозволяє завершувати процеси за їхньою назвою, без необхідності знати PID. Потрібно ввести пошуковий термін, який pkill
використовує для пошуку відповідних процесів у списку запущених. Процеси, що відповідають терміну, будуть завершені. Тому переконайтесь, що пошуковий термін введено правильно.
Для безпеки, перед використанням pkill
, можна скористатися командою pgrep
. Вона також приймає пошуковий термін і показує PID всіх процесів, які йому відповідають. Це безпечно, тому що pgrep
не завершує жодних процесів. Таким чином, якщо ви неправильно введете пошуковий термін, ви не помилитесь. pgrep
та pkill
обробляють пошуковий термін ідентично, тому вони мають спільну сторінку довідки.
Припустимо, є процес з “subq” у назві. Використаємо команду ps -u dave | grep subq
для перегляду процесу. Ви побачите, що “subq” відповідатиме процесу та окремому підпроцесу. Це зроблено для того, щоб ви побачили повну назву процесу.
ps -u dave | grep subq
Припустимо, що користувач не знає повної назви процесу, а тільки те, що вона містить “subq”. Він використовує pgrep
щоб перевірити, чи є тільки один збіг, а потім використовує цей термін з pkill
.
pgrep subq
pkill subq
pkill
дозволяє завершувати кілька процесів одночасно. Наприклад, користувач використовує pgrep
для перевірки кількості запущених процесів Chrome. Потім використовує pkill
, щоб завершити їх всі, і знову перевіряє з pgrep
, що їх не залишилося.
pgrep chrome
pkill chrome
pgrep chrome
Якщо запущено кілька процесів з однаковою назвою, але ви не хочете завершувати їх усі, скористайтесь pgrep
з параметром -f
(командний рядок), щоб розрізнити їх. Простий приклад – два процеси ping
. Ви хочете завершити один з них, а не інший. Для цього можна скористатися їх командними рядками. Зверніть увагу на використання лапок для обгортання параметра командного рядка.
pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"
Команда killall
Попередження: у системах Solaris та OpenIndiana команда killall
завершить роботу всіх ваших процесів. Якщо ви використовуєте root
або команду sudo killall
, ви перезавантажите комп’ютер! Під час дослідження для цієї статті, така поведінка була підтверджена на останній версії OpenIndiana Hipster 2018.10.
Команда killall
діє подібно до pkill
, але має важливу відмінність. Замість передачі пошукового терміну, необхідно вказати точну назву процесу.
Ви не можете вказати частину назви процесу, тільки повну, як показано нижче:
killall shutt
killall shutter
Параметр -y
(молодший за) дозволяє завершувати процеси, які працюють менше заданого часу. Час вказується числом, за яким слідує одиниця вимірювання:
s
(секунди)m
(хвилини)h
(години)d
(дні)w
(тижні)M
(місяці, зверніть увагу на велику “M”)y
(роки)
Для завершення нещодавно запущеного процесу з назвою ana
, і збереження роботи старих екземплярів, можна використати наступну команду, якщо ви відреагували протягом двох хвилин:
killall -y 2m ana
Параметр -o
(старший за) дозволяє завершувати процеси, які працюють довше заданого часу. Наприклад, ця команда завершить всі з’єднання ssh, що працюють більше доби:
killall -o 1d sshd
Будьте обережні
Ці команди дозволять вам точно та безпечно ідентифікувати та завершувати проблемні процеси.
Завжди будьте уважні. По-перше, переконайтеся, що процес, який ви збираєтеся завершити, дійсно той, який вам потрібен. По-друге, перевірте двічі, щоб переконатися, що цільовий процес саме той, який ви хочете завершити. Завершіть процес, лише коли впевнені.