Як наводити аргументи для вбивства через трубу


85

Мені потрібно знайти певний процес і вбити цей процес. Я написав таку команду:

ps -e | grep dmn | awk '{print $1}' | kill

Де назва процесу dmn. Але це не працює. Як я можу знайти процеси за іменем та killїх.

Відповіді:


162
kill $(ps -e | grep dmn | awk '{print $1}')

8
Використовуйте новіший $()синтаксис: kill $(ps -e | grep dmn | awk '{print $1}').
Stratus3D

7
fwiw для інших, мені довелося змінити цю відповідь, щоб змусити її працювати: kill $(ps -efw | grep dmn | grep -v grep | awk '{print $2}')не впевнений, чому, і недостатньо дбає про те, щоб дивитись далі.
joshweir

1
@joshweir Це тому, що в іншому випадку killнамагався вбити навіть процес "grep", який намагався шукати шаблон
meain

Чи не потрібно це буде \nпісля кожного пробудження, як у awk '{print $1"\n"}'?
Сопалахо де Аррієрес

43

Якщо є кілька процесів, які ви хочете видалити, ви можете використовувати це:

ps -efw | grep dmn | grep -v grep | awk '{print $2}' | xargs kill

Примітка: Вам потрібно видалити сам grep-процес із вихідних даних, тому grep -v grepвін використовується.


17
Ви можете уникнути появи grep у вашому grep,
вставивши перші символи

1
@Oldskool Гарний фокус. Використання метасимволів для того, щоб регулярний вираз grep не збігався сам із собою, є приємною ідеєю.
jcollado

@Oldskool, +1, ти геній!
jcr

Хороший фокус, хоча це ускладнює перетворення на сценарій оболонки
метаграф

17

Ви могли б використовувати

pkill dmn 

якщо у вашій системі є команда pkill .


1
+1 для pkill замість killall. Він доступний на декількох платформах без різного "значення" ( killall на Solaris еквівалентно killall5 на Linux, наприклад - Тобто, вбити ВСІ процеси)
plundra

4

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

kill $(ps | awk '/dmn/{print $1}')

4

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

kill -9 $(pidof dmn)


2

Можливо, вам це не знадобиться pipe, якщо у вас є pidofкоманда і ви знаєте назву зображення, я зробив це так:

kill $(pidof synergyc)

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


0
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

привіт друзі .. ми можемо зробити це за допомогою циклу for.

"Деякий пошук" - це будь-яка назва процесу, яку ви хочете здійснити, наприклад, "java", тож, скажімо, кількість процесів Java становить 200+, тому вбивство по одному буде занадто типовим.

так що ви можете використовувати вищезазначену команду.

Дякую.


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