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

49

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

pkill [signal] name

а также

killall [signal] name

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

mavillan
источник
Связанный: unix.stackexchange.com/questions/252349/…
Командующий

Ответы:

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

electropoet
источник
1

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

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

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

user196507
источник