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

Інколи, єдиним виходом з ситуації є завершення процесу. Хоча термін “знищення” звучить досить різко, насправді він означає лише “примусове завершення” роботи процесу. Розглянемо, як це зробити за допомогою командного рядка в 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

Будьте обережні

Ці команди дозволять вам точно та безпечно ідентифікувати та завершувати проблемні процеси.

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