Можно ли связать pgrep с помощью kill?

31

Я заметил, что |используется для отправки результатов первой команды другой. Я хотел бы убить все процессы, которые соответствуют имени.
Вот что обычно делает pgrep:

$ pgrep name
5089
5105

И несколько аргументов, кажется, работают с kill:

sudo kill 5089 5105

Но это неправильно

pgrep name | kill

Так как это сделать правильно?

Томаш Зато - Восстановить Монику
источник
3
pkill, И если это не существует, kill $(pgrep ...).
Микель
Я спрашивал не только из-за этих конкретных команд, но и чтобы лучше понять цепочку команд. Но, как я могу видеть из оценки вопроса, вопросы, которые нужно понять, нежелательны ...
Томаш Зато - Восстановить Монику
Если вы хотите сделать вопрос более общим и убедиться, что он не является дубликатом, я могу проголосовать за него.
Микель
Извините, случайно удалил мой предыдущий комментарий. Я на планшете, и на этом сайте есть очень маленькие кнопки рядом друг с другом.
Микель
Я просто сказал, что я проголосовал, потому что ваш вопрос, похоже, не спрашивал ничего, чему вы не могли бы научиться man pgrep. Кнопка понижающего голоса говорит, что это когда вопрос не требует усилий по исследованию, а я не вижу ничего в вашем вопросе. Извините, если это показалось резким.
Микель

Ответы:

42

Попробуй это:

pgrep name | xargs kill

Если вы используете pgrep name | kill, выходной pgrep nameпоток является подачей на стандартный вывод kill. Потому killчто не читает аргументы из стандартного ввода, так что это не будет работать.

Используя xargs, он будет строить аргументы для killиз стандартного ввода. Пример:

$ pgrep bash | xargs echo
5514 22298 23079
cuonglm
источник
5
Ничего общего с пробелом и новой строкой. Просто потому что kill не читает аргументы на stdin.
Микель
@Mikel: Моя ошибка исправлена.
cuonglm
17

Это должно работать:

pkill name

Я также предлагаю прочитать справочную страницу.

Рубен Чахмахтчян
источник
5

Чтобы ответить на общее, а не конкретное ...

Каналы предназначены для передачи вывода из одной программы в качестве ввода в другую программу.

Похоже, вы пытаетесь использовать вывод одной программы в качестве аргументов командной строки для другой программы, что отличается.

Для этого используйте подстановку команд .

Например, если вы хотите запустить

sudo kill 5089 5105

И у вас есть команда, pgrep nameкоторая выводит5089 5105

Вы кладете их вместе, как

sudo kill $(pgrep name)
Mikel
источник
Большое спасибо. Надеюсь, это поможет и другим новичкам.
Томаш Зато - Восстановить Монику