Найти идентификатор процесса и убить его

16

Когда мне нужно убить фоновый процесс, я делаю ps -e | grep <process_name>

Который печатает что-то вроде этого 1766 ? 00:00:13 conky, тогда я использую идентификатор процесса, killкак это так kill 1766.

Есть ли способ, которым я могу упростить это? Сделать это быстрее? уменьшить количество печатать?

Гаутама
источник
1
Я получил ответ, который хочу, но я подожду некоторое время, прежде чем принять, чтобы сообщество могло извлечь выгоду из различных доступных вариантов.
Гаутам
Пожалуйста, не стесняйтесь сделать этот вопрос более общим, если это возможно, чтобы больше людей могли получить пользу от ответов
Гаутама

Ответы:

19

(TL, ДР: pgrep, pkill)

Многие варианты Unix поставляются с pgrepи его компаньоном pkill: Solaris , Linux (часть стандартных утилит процессов , может отсутствовать в встроенных системах Linux), FreeBSD , OpenBSD , NetBSD ,… но только из MacPorts на OS X , а не AIX , и только недавно в HP-UX . pgrepУтилита показывает идентификатор процесса процессов подобранных по имени, пользователю и несколько других критериев. Аргумент to pgrepинтерпретируется как регулярное выражение, которое должно соответствовать части имени исполняемого файла процесса (если вы не передадите опцию, чтобы изменить это). Если вы позвоните pkillвместоpgrepутилита отправляет сигнал вместо отображения идентификаторов процесса.

Еще одна похожая утилита - pidof . В Linux он предоставляется SysVinit или BusyBox (так что вы часто найдете его во встроенной системе Linux, которая не имеет pgrep); Есть также порты на других вариантах Unix. У pidofутилиты меньше параметров, она в основном совпадает только с полными именами исполняемых файлов. Его вспомогательная утилита killallотправляет сигнал соответствующим программам¹.

¹ Остерегайтесь, что killallимеет другое значение для Solaris и, возможно, других вариантов Unix; не вводите в killallкачестве пользователя root на Solaris.

Жиль "ТАК - перестань быть злым"
источник
Вау, ваш ответ очень подробный, гораздо глубже, спасибо. Пожалуйста, измените вопрос, чтобы соответствовать ответу, если это возможно.
Гаутам
@GautamK Я не думаю, что вопрос нуждается в расширении. Если вы это сделаете, не стесняйтесь редактировать его самостоятельно.
Жиль "ТАК - перестань быть злым"
Из ответов с наибольшим количеством голосов Ваш ответ дает более подробную информацию, поэтому я принимаю его
Гаутам
8
  • killall ProcessName (у этой команды есть недостаток в том, что вы не всегда знаете имя процесса программы).
  • pidof ProccessName и kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Попробуйте эту строку и повторно используйте ее для истории вашего bash, или лучше создайте для нее псевдоним.
Ханан Н.
источник
Второй pidofкажется немного легче, но все же он занимает 2 шага
Gautam
Я могу найти / создать однострочную команду, которая делает это за один шаг (с грубым именем процесса), но для этого потребуется, чтобы вы набрали длинную строку (что сложнее, чем два вышеупомянутых шага), или вы могли бы набрать ее один раз и повторно использовать его из истории.
Ханан Н.
@GautamK Я обновил ответ с помощью опции единой команды.
Ханан Н.
6

Хотя у Ханана есть несколько хороших предложений, я добавлю pgrep / pkill. Они позволяют намного лучше контролировать процесс, который вы находите, и регулярные выражения, если вы не знаете точный процесс, который вам нужно убить.

PS Ханана pidofможно подавать killнапрямую с помощью галочек:

kill `pidof processname`
Kevin
источник
pkillэто было именно то, что я искал, я большую часть времени знаю имя процесса, в основном его conkyили firefoxили chromeили что-то подобное. Спасибо
Гаутам
1

Как насчет этого -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

Пример:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

Обновить:

К сожалению, это , очевидно , не соответствует требованиям меньше печатать так хороший способ сделать это было бы добавить functionк вашему .bashrc, .profileили любой другой сценарий запуска. Функция может быть что-то вроде этого -

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

После добавления вы можете просто передать имя вашего процесса:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
Джайпал Сингх
источник