Поиск идентификатора процесса и его уничтожение

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

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

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

(TL, DR: pgrep , pkill )

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

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

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

  • killall ProcessName (есть недостаток этой команды в том, что вы не всегда знаете имя процесса программы).
  • pidof ProccessName и kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Попробуйте использовать одну строку и повторно используйте ее в истории вашего bash или лучше создайте для нее псевдоним.

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

pidof PS Ханана можно кормить, чтобы kill напрямую с помощью обратных сигналов:

 kill `pidof processname` 

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

 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