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

92

После kill <some_pid>долгих лет использования простого в Unix-системах я учился pkillу более молодого коллеги, разбирающегося в Linux 1 .

Вскоре я принял Linux-путь, pgrep-ing и pkill-ный через много дней и ночей, через замедления и условия гонки. Это было все хорошо и хорошо.

Но сейчас я не вижу ничего, кроме killall. Кажется, как-то упоминаются только инструкции killall, и я не уверен, является ли это какой-то параллельной разработкой, killallпреемником pkillили чем-то еще.

Кажется, он работает более целенаправленно pkill, но я уверен, что что-то упустил.

Может ли Ubuntu / Debian-подкованный 2 человек объяснить, когда (или почему) killallследует использовать, особенно если это следует использовать в предпочтении pkill(когда это pkillчасто кажется проще, потому что я могу быть неаккуратным с сопоставлением имен, по крайней мере по умолчанию).

Говоря о killall, я не имею в виду команду, которая в некоторых системах Unix (Solaris, AIX,?) Убивала все пользовательские процессы. Вот описание этой версии со справочной страницы для IBM AIX :

Команда killall отменяет все запущенные вами процессы, кроме тех, которые производят процесс killall. Эта команда предоставляет удобное средство отмены всех процессов, созданных оболочкой, которой вы управляете. При запуске пользователем root команда killall отменяет все отменяемые процессы, кроме тех, которые его запустили. Если указано несколько сигналов, действует только последний.

1 «коллега» - это бесплатное обновление с «коллеги», так же может быть.
2 Изначально я думал, что это Linux или Debian, но некоторые источники утверждают, что Linux killallявляется производным от BSD со вкусом Unix.

belacqua
источник

Ответы:

68

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

У Pkill и killall есть отличительные варианты. У Killall есть флаг для сопоставления по возрасту процесса, у pkill есть флаг, который убивает только процессы с данным tty. И так далее до тошноты. Ни то, ни другое , у них просто разные специальности.

Я вижу из их страниц руководства , что killall происходит из пакета psmisc , который имеет несколько утилит управления процессами, но, в частности, не содержит ps. Это пакет procps, в котором есть ps, top, kill и pkill (среди прочих). Я держал пари, что у props изначально не было pkill, поэтому psmisc почесал зуд и придумал killall.

Страница man pkill / pgrep говорит, что они были введены в Solaris 7. Как вы упоминаете, jgbelacqua , killall в Solaris не была утилитой, предоставляемой psmisc, поэтому у Solaris, вероятно, был только пакет procps. Кто-то хотел использовать инструмент сопоставления с образцом, таким образом, pkill и pgrep. Был ли он разработан разработчиком procps или добавлен позже, я не знаю. Несмотря на это, он сделал это и стал частью * nixes везде.

Больше источников:

djeikyb
источник
1
Хм - была включена killall(старая?) Система Solaris, но она вела себя по-другому. Это убило все.
Белаква
6
@manish - эээ, в системах SysV был другой killall.
Белаква
1
@djeikyb Мысль о том, что killall безопаснее, звучит правильно, или, по крайней мере, это может объяснить его популярность.
Белаква
5
@Manish: pkill (без kill) не нужен ни номер pid, ни имя процесса. Это совпадает с именем процесса.
Хавьер Ривера
3
killall is safer for users to blindly copy and pasteЗа исключением случаев, когда вы находитесь на машине, где killall действительно убивает всех. К сожалению, две разные утилиты имеют одинаковое название.
Ли Райан
7

Пожалуйста, будьте осторожны с "killall". В некоторых системах (я забыл, какая) killall убивает все процессы. Он будет молча игнорировать аргументы и полностью остановить вашу систему.

phessler
источник
5
Это неправда. killall без аргументов ничего не сделает, а killall не проигнорирует аргументы. kill -9 -1может убить вашу систему, а killall -9 -1может и так. Но не толькоkillall [program]
Томас Уорд
6
Это верно для систем SysV, как уже упоминалось в первоначальном вопросе.
alanc
3

если вы активируете / etc / bash_completion, после killall <part_of_process_name>и нажмите вкладку - авто завершает имя процесса из списка запущенных процессов

реактивный самолет
источник
2
Такое же автоматическое завершение будет сделано с помощью pgrep / pkill. Что-то, что я обычно делаю, это pkill plug<tab>убиваю плагин flash для Firefox, когда я знаю, что у меня нет ничего, что я хочу использовать некоторое время, но все еще хочу активно использовать Firefox. Это функция оболочки, а не разница между killall и pgrep / pkill.
Arcege
1
Я не говорил, что есть разница - просто хорошая функция, позволяющая избежать поиска PID, имен процессов и т. Д.
jet
2

Если вы посмотрите на опции обеих программ, вы увидите, что они обе делают одно и то же, но по-разному.

pkill выполнит сопоставление различных атрибутов процесса (CMD, PID, PPID, UID ...) и отправит данный сигнал каждому соответствующему процессу. (Для CMD используется регулярное выражение, для других это строка). pkill не интерактивен, но лучше для пакетных программ.

killall выполнит сопоставление имени процесса (comm) или пользователя (user), а не всей командной строки. Аргумент используется в качестве простой строки и должен соответствовать всему значению 'comm' (есть также опция --regexp, чтобы изменить это). У killall есть опции --interactive и --younger-than, которых нет у pkill.

Существует также killall5 из дней SysV, который был портирован на другие варианты UNIX (предположительно в пакете Ubuntu 'sysutils'). Это ведет себя по-другому по-старому. Это часто использовалось внутри сценариев инициализации для выключения или перехода в однопользовательский режим.

Arcege
источник
2
Нет, ни и pkillни в killallкоем случае не следует использовать в сценариях, только в интерактивном режиме и с осторожностью.
Гейра