Каково различие между 'killall' и 'pkill'?

После использования просто kill <some_pid> в системах Unix много лет, я учился pkill от младшего опытного Linux коллеги colleague1.

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

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

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

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

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

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

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

92
задан 13 March 2015 в 21:55

4 ответа

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

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

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

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

Дополнительные источники:

0
ответ дан 13 March 2015 в 21:55

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

0
ответ дан 13 March 2015 в 21:55

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

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

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

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

0
ответ дан 13 March 2015 в 21:55

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

0
ответ дан 13 March 2015 в 21:55

Другие вопросы по тегам:

Похожие вопросы: