Как я могу убить процесс по имени вместо PID?

Иногда, когда я пытаюсь запустить Firefox, он говорит: "Процесс Firefox уже запущен". Так что я должен сделать это:

[email protected]:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
[email protected]:~$ kill 7451

То, что я хотел бы, это команда, которая сделает все это для меня. Он взял бы входную строку и grep для нее (или чего-то еще) в списке процессов и убил бы все процессы в выводе:

[email protected]:~$ killbyname firefox

Я пытался сделать это на PHP, но exec('ps aux') кажется, показывает только процессы, которые были выполнены с exec() в самом скрипте PHP (поэтому единственный процесс, который он показывает, это сам).

Ответ 2

Также возможно использование:

pkill -f "Process name".

Для меня это сработало идеально. Это было то, что я искал. pkill не работает с именем без флага.

Когда установлено -f, полная командная строка используется для сопоставления с образцом.

Ответ 3

Вы можете убить процессы по имени с помощью killall <name>

killall отправляет сигнал всем процессам, выполняющим любую из указанных команд. Если имя сигнала не указано, отправляется SIGTERM.

Сигналы могут быть указаны либо по имени (например, -HUP или -SIGHUP), либо по номеру (например, -1), либо с помощью опции -s.

Если имя команды не является регулярным выражением (опция -r) и содержит косую черту (/), процессы, выполняющие этот конкретный файл, будут выбраны для уничтожения независимо от их имени.

Но если вы не видите процесс с помощью ps aux, вы, вероятно, не будете иметь права убивать его...

Ответ 4

Более длинная альтернатива:

kill `pidof firefox`

Ответ 5

Самый простой способ - сначала проверить, что вы получаете правильные идентификаторы процессов:

pgrep -f [part_of_a_command]

Если результат будет таким, как ожидалось. Пойдите с:

pkill -f [part_of_a_command]

Ответ 6

Странно, но я не видел решения вроде этого:

kill -9 `pidof firefox`

он может также убить несколько процессов (несколько pids), например:

kill -9 `pgrep firefox`

Я предпочитаю pidof, поскольку он имеет один вывод строки:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Ответ 7

На Mac я не мог найти pgrep и pkill, ни один из них не работал, поэтому написал простой один лайнер script: -

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

Если есть более простой способ сделать это, разделите.

Ответ 8

Используя команду #killall:

#killall -9 <processname>

Ответ 9

Убить все процессы, имеющие snippet в пути запуска. Вы можете убить все приложения, запущенные из некоторого каталога, добавив /directory/в качестве фрагмента. Это очень полезно, когда вы запускаете несколько компонентов для одного и того же приложения из одного каталога приложений.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Я бы предпочел pgrep, если доступно

Ответ 10

Чтобы убить с помощью grep:

kill -9 `pgrep myprocess`

Ответ 11

более правильным будет:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

Ответ 13

Я задавал себе тот же вопрос, но проблема с текущими ответами в том, что они не безопасно проверяют, что процессы будут убиты, поэтому... это может привести к ужасным ошибкам:)... особенно если несколько процессов соответствуют шаблону.

Как отказ от ответственности, я не профессионал, и, безусловно, есть возможности для улучшения.

Итак, я написал немного sh script:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

Ответ 14

Команда kill по умолчанию принимает имена команд в качестве альтернативы PID. См. kill (1). Часто возникающая проблема заключается в том, что bash предоставляет свой собственный kill, который принимает номера заданий, такие как kill %1, но не имена команд. Это препятствует команде по умолчанию. Если прежняя функциональность более полезна для вас, чем последняя, ​​вы можете отключить версию bash, вызвав

enable -n kill

Для получения дополнительной информации см. записи kill и enable в bash (1).

Ответ 15

Если вы запустите GNOME, вы можете использовать системный монитор (System- > Administration- > System Monitor) для уничтожения процессов, как в Windows. KDE будет иметь что-то подобное.

Ответ 16

ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $

Ответ 17

kill -9 $(ps aux | grep -e myprocessname | awk '{print $2}')

Ответ 18

awk oneliner, который анализирует заголовок вывода ps, поэтому вам не нужно заботиться о номерах столбцов (кроме имен столбцов). Поддержка регулярных выражений. Например, чтобы убить все процессы, имя исполняемого файла (без пути) которых содержит слово "firefox", попробуйте

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*