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

87

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

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

Но теперь я вижу только killall . В How-To, похоже, упоминается только killall , и я не уверен, что это какая-то параллельная разработка, или если killall является преемником pkill или что-то еще.

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

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

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

  

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

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

задан belacqua 22.02.2011 в 07:31
источник

4 ответа

63

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

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

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

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

Другие источники:

ответ дан djeikyb 22.02.2011 в 08:06
источник
7

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

    
ответ дан phessler 30.07.2012 в 08:26
3

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

    
ответ дан jet 22.02.2011 в 12:28
2

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

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

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

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

    
ответ дан Arcege 22.02.2011 в 13:24