Как дать аргументы для убийства через трубу


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', который пытался искать шаблон
Майн

Разве это не требуется \nпосле каждой awk, например, в awk '{print $1"\n"}'?
Sopalajo de Arrierez

45

Если вы хотите удалить несколько процессов, вы можете использовать это:

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

Примечание: вам нужно удалить сам процесс grep из вывода, поэтому grep -v grepон используется.


17
Вы можете избежать появления grep в своем grep, поместив первый символ в квадратные скобки, например: grep [d] mn
Oldskool

1
@Oldskool Хороший трюк. Хорошая идея - использовать метасимволы, чтобы регулярное выражение grep не соответствовало самому себе.
jcollado

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

Хороший трюк, хотя превратить его в сценарий оболочки сложнее
Metagrapher

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.

«Some search» - это любое имя процесса, которое вы хотите найти, например «java», так что, допустим, количество java-процессов составляет 200+, так что уничтожение одного за другим будет слишком типичным.

так что вы можете использовать вышеуказанную команду.

Благодарю.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.