В чем разница между kill, pkill и killall?

Вопрос или проблема

Я знаком с командой 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-подобных операционных системах. Они различаются по методам определения процессов для завершения и по формату команд. Понимание их различий поможет более эффективно управлять ресурсами системы и обеспечивать её стабильность.

Оцените материал
Добавить комментарий

Капча загружается...