Найти виновника: top, ps и pgrep
Прежде чем что-то завершать, нужно понять, какой именно процесс создаёт проблему. Для этого есть три привычных инструмента.
top показывает живой список процессов с нагрузкой на процессор и память. В Linux внутри top клавиша P сортирует по процессору, M по памяти, q завершает работу. В macOS top устроен иначе: для сортировки по загрузке процессора используют запуск top -o cpu. Если вам удобнее окно, на Mac есть программа «Мониторинг системы» (Activity Monitor), где процесс завершают кнопкой в панели.
ps делает моментальный снимок. Вариант ps aux выводит все процессы с пользователем, загрузкой процессора и памяти, номером PID и командой; он работает и в Linux, и в macOS. Результат часто направляют в grep, чтобы найти нужное имя, но надёжнее pgrep -l слово: он выводит PID и имя без лишней строки от самого grep.
Запишите PID — числовой идентификатор процесса. Он понадобится для следующих команд. Номер уникален только пока процесс жив, и после его завершения может достаться другой программе, поэтому проверяйте PID непосредственно перед использованием.
kill не всегда убивает: что за сигналы
Название команды kill сбивает с толку: на самом деле она отправляет процессу сигнал, а что с ним произойдёт, решает сам процесс или система. Самые полезные сигналы:
| Сигнал | Номер | Смысл |
|---|---|---|
| SIGTERM | 15 | вежливая просьба завершиться; значение по умолчанию |
| SIGINT | 2 | прерывание, то же, что Ctrl+C в терминале |
| SIGHUP | 1 | часто означает «перечитай настройки» или обрыв терминала |
| SIGKILL | 9 | немедленное завершение, программа не может его перехватить |
| SIGSTOP | 19 в Linux | приостановка |
Команда kill 1234 отправляет SIGTERM процессу с PID 1234. Программа получает шанс сохранить данные, закрыть файлы и корректно выйти. Команда kill -9 1234 отправляет SIGKILL: система обрывает процесс принудительно, без очистки. Номера сигналов на разных системах могут немного различаться, поэтому имя надёжнее числа: kill -TERM и kill -KILL понятны везде.
Порядок действий: от мягкого к жёсткому
Хорошая практика — не начинать сразу с kill -9, а переходить от мягкого способа к жёсткому.
- Закройте программу обычным способом, если интерфейс откликается. На Mac попробуйте «Завершить принудительно» из меню Apple или Cmd+Option+Esc.
- Найдите PID: pgrep -l имя или ps aux с поиском.
- Отправьте обычный сигнал: kill PID.
- Подождите несколько секунд и проверьте, исчез ли процесс: ps -p PID. Если команда ничего не показывает, процесс завершён.
- Если процесс остался, отправьте kill -9 PID.
- Убедитесь, что нужная программа запущена заново и работает корректно.
Принудительное завершение имеет цену: несохранённые данные теряются, временные файлы остаются, а блокировки базы данных или файлов могут не сняться. После kill -9 у программы иногда нужно удалить файл блокировки или проверить целостность данных. Для баз данных и служб, которые пишут на диск, жёсткое завершение — крайняя мера, а лучше воспользоваться штатной командой остановки службы.
pkill, killall и осторожность с шаблонами
Если процессов с одним именем много, например несколько окон одной программы, удобны команды по имени. pkill имя отправляет сигнал всем процессам, чьё имя содержит указанный фрагмент, а killall имя делает то же по точному имени. Поведение killall отличается между системами: в Linux он завершает по имени, а в некоторых Unix-системах команда с таким названием останавливает почти всё, поэтому проверяйте документацию.
Совет по безопасности: перед массовым завершением выполните pgrep -l с тем же шаблоном и посмотрите, кто попадёт под удар. Короткий фрагмент вроде «a» или «ssh» может совпасть с десятками процессов, среди которых окажутся нужные службы или ваша собственная сессия.
Кроме того, учтите права. Обычный пользователь завершает только свои процессы, чужие требуют sudo. Это ограничение защищает вас, а не мешает. Не завершайте процессы с PID 1 и системные службы, название и роль которых вам не известны: в лучшем случае пропадёт часть функций, в худшем система перезагрузится.
Когда kill -9 не помогает
Бывает, что даже принудительный сигнал не убирает процесс. Основные случаи:
- процесс в состоянии ожидания ввода-вывода (в ps он помечен буквой D): он ждёт ответа от диска или сетевой папки, и сигнал сработает, когда операция завершится; причину ищут в устройстве или подключении;
- зомби-процесс (в ps отмечен буквой Z): он уже завершился, а родитель не забрал его статус; убить зомби нельзя, нужно завершить или перезапустить родительский процесс;
- процесс принадлежит другому пользователю или системе, и нужны права администратора;
- программа автоматически перезапускается службой-надсмотрщиком, поэтому её надо останавливать штатной командой службы, а не сигналом.
Если Mac или компьютер повисает целиком и новые окна не открываются, помочь могут только перезагрузка или удержание кнопки питания, но это крайняя мера. Чтобы потом разобраться в причине, сохраните записи журнала: в Linux через journalctl, в macOS через «Консоль». Повторяющееся зависание одной и той же программы — повод искать обновление, проверять диск и память, а не просто убивать процесс каждый раз.
Как не допустить повторения
Завершение процесса лечит симптом, а не причину. Если одна и та же программа зависает регулярно, имеет смысл выяснить, почему. Посмотрите по top или Activity Monitor, растёт ли потребление памяти со временем: постоянный рост намекает на утечку, а скачок процессора при определённом действии — на ошибку в конкретной функции или на конфликт с другой программой.
Проверьте свободное место на диске и состояние памяти: нехватка того или другого часто делает систему вялой, и тогда виновата не одна программа. Обновите зависающую программу и систему: многие сбои исправляются в обновлениях. Посмотрите журнал на момент зависания, через journalctl.
Для служб, которые должны работать постоянно, настройте автоматический перезапуск средствами системы, а не пишите сценарии с вечным циклом. А для долгих задач в терминале используйте приёмы, которые не завязаны на закрытие окна, чтобы завершение сессии не обрывало работу. Так вы сократите случаи, когда процесс вообще нужно убивать.