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

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

jeremy@jeremy-desktop:~$ 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
jeremy@jeremy-desktop:~$ kill 7451

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

jeremy@jeremy-desktop:~$ killbyname firefox

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


person Paige Ruten    schedule 02.10.2008    source источник
comment
Когда я получаю окно, в котором говорится, что Firefox уже запущен, мне обычно просто нужно подождать одну секунду, и я могу снова запустить Firefox (конечно, это может быть не всегда).   -  person nuoritoveri    schedule 24.02.2014
comment
Это самый безопасный способ, как говорит ДжонБ в своем ответе: stackoverflow.com/questions/6381229/   -  person tecnoshopbq    schedule 08.05.2014
comment
Это старый вопрос, но не могли бы вы изменить принятый ответ? Тот, который вы отметили, не работает со многими процессами, например, запущенными JVM.   -  person Luís de Sousa    schedule 01.12.2017
comment
Для всех, кто ссылается на эту тему, в приведенном выше комментарии Луис ссылается на ответ ниже, который рекламирует команду pkill -f "Process name" ...   -  person Digger    schedule 01.08.2018


Ответы (17)


pkill firefox

Дополнительная информация: http://linux.about.com/library/cmd/blcmdl1_pkill.htm < / а>

person shoosh    schedule 02.10.2008
comment
Использование pgrep для определения того, что вы убиваете, перед тем, как приступить к уничтожению процессов, - это хорошо. Особенно при использовании -f. - person Akrikos; 09.10.2013
comment
pkill не очень дружелюбный. вы не можете давать ему имена так же, как killall их принимает. - person Octopus; 20.11.2013
comment
pkill -U <username> весьма кстати. У меня есть веб-сервер Solaris, реальный демон веб-сервера, настроенный как Служба с собственным пользователем. Таким образом, указание пользователем - это простой / легкий способ запустить перезапуск. - person Raystorm; 10.02.2015
comment
Чтобы принудительно убить: pkill -9 firefox - person Justas; 31.07.2015
comment
В лучшем случае это работает в половине случаев. Для комплексного решения вам понадобится как минимум флаг -f. - person Luís de Sousa; 01.12.2017
comment
Интересно, почему вы выбрали firefox ... Мне просто пришлось буквально скопировать и вставить эту команду ... Угадайте, почему, обновления НИКОГДА не проходят гладко ... Спасибо, кстати :) - person Aleksandar Pavić; 27.02.2020

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

pkill -f "Process name"

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

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

person Victor    schedule 07.01.2015
comment
особенно для запуска чего-либо с wine действительно необходима опция -f. например pkill -f "EvilWindowsServer.exe" - person CodeBrauer; 27.05.2015
comment
Это должен быть принятый ответ. Первый ответ не подходит для многих типов программ, например те, которые работают на JVM. - person Luís de Sousa; 01.12.2017
comment
Мне также пришлось добавить флаг -f, чтобы убить фоновый процесс, выполняющий скрипт Python. - person Mason; 08.08.2018
comment
Это должен быть предпочтительный ответ. - person Owl; 05.04.2021

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

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

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

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

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

person Andre Bossard    schedule 02.10.2008
comment
Чтобы принудительно завершить программу, которая не отвечает, отправьте KILL вместо TERM: killall -s KILL firefox - person Martin Hansen; 22.05.2016

Немного более длинная альтернатива:

kill `pidof firefox`
person Walter    schedule 02.10.2008
comment
pidof firefox | xargs kill -9 - person hbt; 16.12.2012
comment
этот работает под busybox для ваших встраиваемых устройств :) - person nwgat; 24.07.2015

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

pgrep -f [part_of_a_command]

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

pkill -f [part_of_a_command]
person Tahsin Turkoz    schedule 12.07.2016
comment
недооцененный ответ ???? - person seven; 20.02.2021

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

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

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

person Mike    schedule 05.04.2017
comment
Это часто встречающаяся комбинация антипаттернов. Используйте регулярное выражение, которое не соответствует самому себе (или имени содержащего скрипта), и избегайте бесполезно grep. ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill - person tripleee; 27.11.2018
comment
избегая бесполезного grep, вы не избегаете опечаток и возможности использовать команду в автоматизированных процессах, которые параметризуют ‹snippet› - person Mike; 28.11.2018
comment
ЭТО действительно лучший способ сделать это! - person Abhinandan Dubey; 10.01.2019
comment
Было бы здорово понять, почему [s] @ tripleee работает с точки зрения несоответствия самому процессу awk? - person andig; 02.11.2019
comment
Потому что регулярное выражение [x]y соответствует строке xy, но не наоборот. Это распространенный FAQ. Ссылка ведет на страницу, созданную более 20 лет назад, где это объясняется более подробно; и этот вопрос повторялся уже тогда. - person tripleee; 02.11.2019
comment
Вы можете легко сгенерировать [s]nippet из snippet. Bash имеет [${variable:0:1}]${variable:1} или более переносимо, вы можете использовать подстановку параметра ${variable#?}, чтобы оторвать первый символ. - person tripleee; 02.11.2019
comment
Это был вариант, который мне нужно было использовать в Git Bash в Windows, поскольку другие утилиты были недоступны. Спасибо! - person ATutorMe; 23.11.2020
comment
Если вы часто используете это и хотите определить для этого псевдоним, вам необходимо внести небольшие изменения в часть awk. Дополнительную информацию см. Здесь: superuser.com/a/696420 - person ATutorMe; 23.11.2020

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

kill -9 `pidof firefox`

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

kill -9 `pgrep firefox`

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

> pgrep firefox
6316
6565
> pidof firefox
6565 6316
person prosti    schedule 02.10.2016
comment
Когда я выполняю это, я получаю ошибку kill: invalid number 'pidof myprogram'. Что здесь плохого? - person Brethlosze; 20.09.2017
comment
это только что спасло мне жизнь сегодня ... Я не хочу больше писать, но я рад, что нашел это здесь. Спасибо чувак. - person MilMike; 26.10.2017
comment
Приходит поздно, но на случай, если кто-то еще удивится… @Brethlosze вы ставите одиночные галочки, а команда требует обратных кавычек. - person spectras; 10.12.2018
comment
Спасибо! .. Я буду (и я) в курсе этих обратных кавычек :) - person Brethlosze; 13.12.2018

На Mac я не мог найти ни pgrep, ни pkill, ни killall не работал, поэтому написал простой однострочный скрипт: -

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

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

person Dhiraj    schedule 21.02.2013
comment
Ржу не могу. Это безумная команда для такой задачи. Ничего. Вы назвали эту простую одну линию? : D Простой - это killall - person m3nda; 14.07.2014
comment
@ erm3nda :-) Согласен. Оглядываясь назад, это выглядит безумием. Не могу вспомнить, почему killall тогда не работал на моем Mac. - person Dhiraj; 17.07.2014
comment
Это очень полезно, когда вы хотите убить определенный процесс Java, например jboss. В этом случае killall не поможет. - person Jan M; 01.12.2015

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

killall processname

Используйте -9 или -KILL, чтобы принудительно убить программу (параметры аналогичны команде kill).

person user2396265    schedule 18.05.2013

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

kill -9 `pgrep myprocess`
person edW    schedule 14.11.2014
comment
Работал у меня. Были проблемы с настройкой alias, но он заработал, экранировав символы `: alias k = "kill -9 \`pgrep xyz\`" - person Pixel; 18.02.2021

правильнее было бы:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid
person Chadiso    schedule 23.05.2014
comment
Почему вы export переменную, которую собираетесь использовать только один раз в одном и том же процессе? - person tripleee; 27.11.2018

Обычно я использую команду killall.

Проверьте эту ссылку, чтобы получить подробную информацию об этой команде.

person Bittercoder    schedule 02.10.2008

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

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

Итак, я написал небольшой сценарий sh:

#!/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
person Fab    schedule 22.02.2016

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

person Bernard    schedule 02.10.2008

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

enable -n kill

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

person The Vee    schedule 15.12.2015
comment
Как повторно активировать действие, сделанное enable -n kill? - person Brethlosze; 20.09.2017
comment
@hyprfrcb enable kill - person The Vee; 20.09.2017

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

person Nived Thanima    schedule 21.06.2016

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.*
person Andrey Bochkov    schedule 27.06.2019