Як я можу вбити процес на ім'я замість PID?


349

Іноді, коли я намагаюся запустити 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 (тому єдиний процес, який він показує, - це сам).


Коли я отримую вікно, яке говорить про те, що Firefox вже працює, мені зазвичай доводиться зачекати одну секунду, і я можу запустити Firefox знову (звичайно, це не завжди може бути).
nuoritoveri

1
Це найбезпечніший спосіб , як каже Johnb у відповідь: stackoverflow.com/questions/6381229 / ...
tecnoshopbq


Це старе запитання, але чи можете ви змінити прийняту відповідь? Той, який ви позначили, зазнає невдачі з багатьма процесами, як ті, якими керує JVM.
Luís de Sousa

Для всіх, хто посилається на цю тему, Луїс згадує відповідь нижче, яка торкається pkill -f "Process name"команди ...
Digger

Відповіді:


505
pkill firefox

Більше інформації: http://linux.about.com/library/cmd/blcmdl1_pkill.htm


7
Використання pgrep для з'ясування того, що ви вбиваєте, перш ніж обходити процеси вбивства, є доброю справою. Особливо при використанні -f.
Акрикос

pkill isnt дуже доброзичливий. Ви не можете дати їм імена так само, як їх приймає Кіллалл.
Восьминіг

2
pkill -U <username>цілком зручно. У мене веб-сервер Solaris , фактичний демон веб-сервера, налаштовується як Сервіс із власним користувачем. Отже, зазначення користувачем - це простий / простий спосіб викликати перезапуск.
Райсторм

6
Змусити вбити: pkill -9 firefox
Justas

У кращому випадку це працює вдвічі. Вам потрібен принаймні -fпрапор для рішення всебічної служби.
Luís de Sousa

112

Також можливе використання:

pkill -f "Process name"

Для мене це спрацювало чудово. Це було те, що я шукав. pkill не працює з ім'ям без прапора.

Коли -fвстановлено, повний командний рядок використовується для відповідності шаблону.


2
спеціально для запуску що - то з вином-f дійсно потрібен варіант. наприкладpkill -f "EvilWindowsServer.exe"
CodeBrauer

Це має бути прийнятою відповіддю. Перша відповідь не відповідає багатьом програмам, наприклад, тим, що працюють на JVM.
Luís de Sousa

1
Мені також довелося додати -fпрапор для вбивства фонового процесу під керуванням сценарію Python.
Мейсон

у моєму випадку мені знадобилися 2 прапори:pkill -f -9 PROCESSNAME
Slavik

64

Ви можете вбивати процеси на ім'я за допомогоюkillall <name>

killall посилає сигнал усім процесам, що виконують будь-яку із заданих команд. Якщо ім'я сигналу не вказано, надсилається SIGTERM.

Сигнали можуть бути вказані або за назвою (наприклад, -HUP або -SIGHUP ), або за номером (наприклад, -1 ), або за допомогою опції -s .

Якщо ім'я команди не є регулярним виразом (параметр -r ) і містить косу рису (/), процеси, що виконують цей конкретний файл, будуть обрані для вбивства, незалежно від їх імені.

Але якщо ви не бачите цього процесу ps aux, ви, ймовірно, не будете мати право його вбивати ...


6
Щоб примусити припинити програму, яка не відповідає, надішліть KILL замість TERM:killall -s KILL firefox
Мартін Хансен

45

Трохи довша альтернатива:

kill `pidof firefox`

25
pidof firefox | xargs kill -9
hbt

1
цей працює під зайнятим для ваших вбудованих пристроїв :)
nwgat

25

Найпростіший спосіб - це спочатку перевірити, чи ви отримуєте правильні ідентифікатори процесу за допомогою:

pgrep -f [part_of_a_command]

Якщо результат такий, як очікувалося. Супроводжувати:

pkill -f [part_of_a_command]

19

Дивно, але я не бачив такого рішення:

kill -9 `pidof firefox`

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

kill -9 `pgrep firefox`

Я вважаю за краще, pidofоскільки він має однорядний вихід:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Коли я це виконую, я отримав помилку kill: invalid number 'pidof myprogram'. Що тут поганого ?.
Brethlosze

це просто врятувало моє життя сьогодні ... Я не хочу більше писати, але радий, що знайшов його тут. дякую людині.
MilMike

1
Пізно, але якщо хтось інший задумається…
спектри

Дякую! .. Я буду (і я знаю) про ці події :)
Brethlosze

13

Вбийте всі процеси, що знаходяться snippetна шляху запуску. Ви можете вбити всі програми, запущені з якогось каталогу, додавши / каталог / як фрагмент. Це досить корисно, коли ви запускаєте кілька компонентів для однієї програми з одного каталогу додатків.

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

* Я б надав перевагу pgrep, якщо вона є


1
Це часто зустрічається поєднання антишарових малюнків. Використовуйте регулярний вираз, який не відповідає самій собі (або імені скрипта, що містить), і уникайте марногоgrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
трійка

1
уникаючи марних грепів, ви не уникаєте помилок друку та вміння використовувати команду в автоматизованих процесах, які параметризують <snippet>
Майк

Це дійсно найкращий спосіб зробити це!
Абхіндандан Дюбі

Було б чудово зрозуміти, чому роботи @ tripleee з [s]точки зору не узгодження самого процесу awk?
andig

Тому що регулярний вираз [x]yвідповідає рядку, xyа не навпаки. Це поширений FAQ. Посилання на сторінку більш ніж 20 років тому, що пояснює це детальніше; і це вже повторювалося питання.
тріплей

11

На Mac я не міг знайти pgrep і pkill, а також не працював killall, тому написав простий сценарій одного вкладиша: -

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

Якщо є простіший спосіб зробити це, будь ласка, поділіться.


1
Лол. Це божевільна команда до такого завдання. Не звертай уваги. Ви називали це простим одним рядком? : D Simple is killall
m3nda

@ erm3nda :-) Згоден. Озираючись назад, це виглядає божевільно. Не можу згадати, чому killall тоді не працював на моєму комп'ютері.
Dhiraj

Це дуже корисно, коли ви хочете вбити певний процес Java, наприклад "jboss". У цьому випадку killall не допомагає.
січень M



5

правильніше було б:

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

1
Чому ви exportвикористовуєте змінну, яку ви збираєтесь використовувати лише один раз у тому ж процесі?
трійка


3

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

Як відмова від відповідальності, я не є професіоналом і, безумовно, є можливість для вдосконалення.

Тому я написав невеликий сценарій 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

2

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


2

Команда за замовчуванням killприймає імена команд як альтернативу PID. Дивіться вбити (1) . Проблема, яка часто виникає, полягає в тому, що вона bashзабезпечує власні, killякі приймають номери завдань, як kill %1, але не імена команд. Це перешкоджає команді за замовчуванням. Якщо перший функціонал для вас корисніший за останній, ви можете відключити bashверсію, зателефонувавши

enable -n kill

Для отримання додаткової інформації див. killТа enableзаписи в bash (1) .


Як я відновлюю цю дію enable -n kill?
Brethlosze

1
@hyprfrcbenable kill
The Vee



0

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.*
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.