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

31

Я знаком с killкомандой, и большую часть времени мы просто используем kill -9 для принудительного завершения процесса, есть много других сигналов, которые можно использовать kill. Но мне интересно, каковы случаи использования pkillи killall, если уже есть команда kill.

Делать pkillи killallиспользовать killкоманды в их реализации? Я имею в виду, что они просто обертки killили у них есть своя реализация?

Также хотелось бы узнать, как pgrepкоманда получает идентификатор процесса из имени процесса.

Все ли эти команды используют одни и те же системные вызовы? Есть ли разница с точки зрения производительности, какая из них быстрее?

Иджаз Ахмад Хан
источник
2
Две вещи: зачем использовать kill -9по умолчанию? -15 (пожалуйста, прекратите) и -1 (модем повесил трубку, пожалуйста, ЧИСТО закрывайте сами) гораздо более вежливы. Во- вторых. Остерегайтесь использования killall на не-linux боксах. Это может вести себя по-другому. (Например, на Солярисе это убивает всех. НЕ ФИЛЬТРИРОВАНО на названиях процессов).
Хеннес
Связанный: unix.stackexchange.com/questions/91527/…
Командующий

Ответы:

31

Команда 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не. Я не могу сказать, есть ли разница в производительности: вам придется оценивать это самостоятельно.

Otheus
источник
2

kill и killall - это инструменты, которые предоставляют способ убить процесс. Первый по его PID, второй по его имени. pgrep (список) и pkill (уничтожение по умолчанию) - это инструменты, которые обеспечивают способ отправки сообщения процессу по его имени или другим атрибутам, см. http://linux.die.net/man/1/pkill. Подробнее о сигналы: http://linux.die.net/man/7/signal

dervishe
источник
Вы имеете в виду killall, используется, чтобы убить процесс по имени? и он использует pgrep для этого? а killallтакже убивает все дочерние процессы, какой сигнал killallиспользует по умолчанию?
Иджаз Ахмад Хан
3
... если вы не используете Solaris, в этом случае killallбудут уничтожены все процессы, которые вы имеете право уничтожить, поэтому, если вы являетесь пользователем root, вы фактически перезагрузите сервер.
Дженни Д
1
да: killall chromiumубьет процесс хромирования, pgrep chromiumвыдаст вам список PID, pkill chromiumубьет хром. killall пошлет сигнал SIGTERM по умолчанию (как pkill)
dervishe