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


49

Я знаю, что pkillимеет больше правил фильтрации, чем killall. У меня вопрос, в чем разница между:

pkill [signal] name

а также

killall [signal] name

Я читал, что killallэто более эффективно и уничтожает все процессы и подпроцессы (и рекурсивно), которые соответствуют nameпрограмме. pkillне делает это тоже?


Ответы:


46

pgrepИ pkillкоммунальные услуги были введены в компании Sun Solaris 7 и, как отметил g33klord , они берут образец в качестве аргумента , который сопоставляется с именами запущенных процессов. Пока pgrepпросто печатает список совпадающих процессов, pkillотправит указанный сигнал (или SIGTERMпо умолчанию) процессам. Общие параметры и семантика между pgrepи pkillудобны, когда вы хотите быть осторожными и сначала просмотреть процессы сопоставления списков pgrep, а затем приступить к их уничтожению pkill. pgrepи pkillпредоставляются в PROCPS пакет, который также предоставляет другую /procфайловую систему утилита, такие как ps, top, free, uptimeсреди других.

Команда killallпредоставляется пакетом psmisc и отличается pkillтем, что по умолчанию она точно соответствует имени аргумента (до первых 15 символов) при определении процессов, на которые будут отправляться сигналы. Опция -e, --exactможет быть указана, чтобы также требовать точных совпадений для имен длиннее 15 символов. Это делает killallболее безопасным использование по сравнению с pkill. Если указанный аргумент содержит /символы slash ( ), он интерпретируется как имя файла, и процессы, выполняющие этот конкретный файл, будут выбраны в качестве получателей сигнала. killallтакже поддерживает регулярные выражения имен процессов, через -r, --regexpвариант.

Есть и другие отличия. killallКоманды, например , имеют опции для согласования процессов по возрасту ( -o, --older-thanи -y, --younger-than), в то время как pkillможно сказать только процессы глушения на конкретный терминале (через -tопцию). Очевидно, что две команды имеют определенные ниши.

Обратите внимание, что killallкоманда в системах, происходящих от Unix System V (в частности , Solaris от Sun , IBM AIX от IBM и HP-UX от HP ), убивает все процессы, убиваемые конкретным пользователем, эффективно отключая систему, если она запускается пользователем root.

Утилиты Linux psmisc были портированы на BSD (и в расширении Mac OS X ), поэтому killallследует семантика «уничтожить процессы по имени».


Основное различие, с которым я столкнулся, заключается в том, что пользователь останавливает команды шаблона killall -u <username> -r <process>или pkill <process> -U <uid>делает killallего намного проще для меня.
Jeremysprofile

13

pkillэто тот, который стоит преподавать будущим поколениям, как из-за фильтров, которые вы упомянули, так и из-за того, что он в сочетании с возможностью многократного использования pgrep. Они убивают процессы одинаково, и ни один не убивает рекурсивно - хотя с помощью pgrep, вы можете выбрать по сеансу (pertty, think setsid) или группе процессов (Think Job Control).


8

Единственное отличие состоит в том, что killallв качестве аргумента принимается точное имя процесса, тогда как pkillможет принимать частичное или полное имя.

Вы можете обратиться к этому вопросу, чтобы узнать подробно о pkill


1

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

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

Родительский терминал UID команды

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.