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

85

Мне нужно найти определенный процесс и убить этот процесс. Я написал такую ​​команду:

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

Где имя процесса dmn. Но это не работает. Как найти процессы по именам и killим.

user567879
источник

Ответы:

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он используется.

Jcollado
источник
17
Вы можете избежать появления grep в своем grep, поместив первый символ в квадратные скобки, например: grep [d] mn
Oldskool
1
@Oldskool Хороший трюк. Хорошая идея - использовать метасимволы, чтобы регулярное выражение grep не соответствовало самому себе.
jcollado
@Oldskool, +1, ты гений!
jcr
Хороший трюк, хотя превратить его в сценарий оболочки сложнее
Metagrapher
17

Вы могли бы использовать

pkill dmn 

если в вашей системе есть команда pkill .

Unutbu
источник
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. Короче и проще для понимания, чем некоторые другие варианты, но также может быть менее гибким и более прямым.

NotVeryPythonic
источник
0
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

привет друзья .. мы можем сделать это с помощью цикла for.

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

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

Благодарю.

Нишант
источник
0

Используйте pgrepс опцией -f. kill $(pgrep -f dmn)

Дипак Шарма
источник
4
Если да pgrep, то почему не просто так pkill -f dmn?
muru 01