Вопрос или проблема
Я знаком с командой kill
, и большую часть времени мы просто используем kill -9
для принудительного завершения процесса, хотя есть много других сигналов, которые можно использовать с kill
. Но мне интересно, какие случаи использования у pkill
и killall
, если команда убить уже существует.
Используют ли pkill
и killall
команду kill
в своей реализации? То есть, являются ли они просто оболочками над kill
или имеют свою собственную реализацию?
Мне также хотелось бы узнать, как команда pgrep
получает идентификатор процесса по имени процесса.
Используют ли все эти команды одни и те же системные вызовы? Есть ли разница с точки зрения производительности, какая из них быстрее?
Команда kill
является очень простой оболочкой для системного вызова kill
, который знает только о идентификаторах процессов (PID). pkill
и killall
также являются оболочками для системного вызова kill
(на самом деле, для библиотеки libc, которая непосредственно вызывает системный вызов), но могут определить PID для вас, основываясь на таких вещах, как имя процесса, владелец процесса, идентификатор сессии и так далее.
Как работают pkill
и killall
, можно увидеть с помощью ltrace
или strace
. В Linux они оба читают через файловую систему /proc
, и для каждого найденного PID (директории) проходят путь, чтобы идентифицировать процесс по его имени или другим атрибутам. Как это сделано, с технической точки зрения, зависит от ядра и системы. В общем, они читают из /proc/<PID>/stat
, который содержит имя команды как 2-е поле. Для pkill -f
и pgrep
изучают запись /cmdline
для каждого процесса PID.
pkill
и pgrep
используют системный вызов readproc
, тогда как killall
— нет. Я не могу сказать, есть ли разница в производительности: вам нужно будет провести замер самостоятельно.
Более практичный ответ:
-
kill
отправит сигнал SIGTERM (завершение процесса) операционной системе для данного идентификатора процесса (например, 10341), по умолчанию это SIGTERM. Вы также можете указать другие сигналы (например, -9 для принудительного завершения) -
killall
отправит SIGTERM всем процессам, которые соответствуют определенному имени точно. Он также имеет другие полезные функции, такие как ограничение по пользователю. -
pkill
отправит SIGTERM всем процессам, которые соответствуют заданному шаблону. Он использует pgrep под капотом.
kill и killall — это инструменты, которые предоставляют способ завершения процесса. Первый — по его PID, второй — по его имени. pgrep (список) и pkill (завершить по умолчанию) — это инструменты, которые предоставляют способ отправки сообщения в процесс по его имени или другим атрибутам. Смотрите: http://linux.die.net/man/1/pkill Для получения дополнительной информации о сигналах: http://linux.die.net/man/7/signal
В мануалах macOS есть интересный раздел:
ЗАМЕТКИ ПО РЕАЛИЗАЦИИ
Эта реализация killall для FreeBSD имеет совершенно другую семантику по сравнению с
традиционным поведением killall в UNIX System V. Последний убивает все процессы, которые
текущий пользователь может завершить, и предназначен для использования только процессом завершения работы системы.
Ответ или решение
Разница между kill, pkill и killall
Команды kill
, pkill
и killall
являются важными инструментами в операционных системах на базе Unix, таких как Linux и macOS, и используются для управления процессами. Несмотря на то, что они все связаны с завершением процессов, между ними есть значительные различия в функциональности и способах применения.
1. Команда kill
Команда kill
— это основной инструмент для отправки сигналов процессам по их идентификатору процесса (PID). Обычно она используется для отправки сигнала SIGTERM
, который завершает процесс. Если необходимо принудительно завершить процесс, используется сигнал -9
(SIGKILL).
Синтаксис:
kill [опции] <PID>
Пример использования:
kill 1234 # Отправляет SIGTERM процессу с PID 1234
kill -9 1234 # Принудительно завершает процесс с PID 1234
2. Команда pkill
Команда pkill
предоставляет более гибкий способ управления процессами, позволяя завершать их по именам или другим шаблонам. Она используется для отправки сигналов всем процессам, соответствующим заданному шаблону.
Синтаксис:
pkill [опции] <шаблон>
Пример использования:
pkill firefox # Завершает все процессы с названием "firefox"
pkill -f python # Завершает процессы, имя которых содержит "python" в командной строке
Команда pkill
фактически использует механизм, аналогичный команде pgrep
, для идентификации процессов по заданному шаблону.
3. Команда killall
Команда killall
, как и pkill
, позволяет отправлять сигналы множеству процессов, но с некоторыми отличиями. Она завершает все процессы, которые точно соответствуют заданному имени. В отличие от pkill
, killall
работает только по точному совпадению имени процесса.
Синтаксис:
killall [опции] <имя_процесса>
Пример использования:
killall chrome # Завершает все процессы с точным названием "chrome"
На различных операционных системах поведение killall
может отличаться. Например, в FreeBSD killall
имеет отличные семантики по сравнению с системами System V.
Подход к реализации
pkill
и killall
обрабатывают запросы, основываясь на информации, хранящейся в файловой системе /proc
, где содержатся данные о процессах и их свойствах. Конкретно, они анализируют файлы /proc/<PID>/stat
для получения информации о процессе и определяют, подходит ли он под заданный шаблон.
С точки зрения реализации, все три команды используют системные вызовы, но при этом pkill
и pgrep
используют системный вызов readproc
, который позволяет более эффективно извлекать информацию о процессах.
Параллели и производительность
С точки зрения производительности, основные различия могут не быть значительными, но это зависит от контекста. Например, если вам нужно завершить много процессов, подход с использованием pkill
может быть более удобным, чем многократные вызовы kill
с указанием PID. Рекомендуется тестировать производительность в зависимости от конкретной нагрузки и конфигурации системы.
Заключение
Таким образом, команды kill
, pkill
и killall
являются мощными инструментами для управления процессами в Unix-подобных операционных системах. Они различаются по методам определения процессов для завершения и по формату команд. Понимание их различий поможет более эффективно управлять ресурсами системы и обеспечивать её стабильность.