Posso encadear o pgrep com kill?


31

Percebi que |é usado para enviar resultados do primeiro comando para o outro. Eu gostaria de matar todos os processos que correspondem a um nome.
Isto é o que o pgrep normalmente faz:

$ pgrep name
5089
5105

E vários argumentos parecem funcionar com kill:

sudo kill 5089 5105

Mas isso está errado:

pgrep name | kill

Então, como fazer isso corretamente?


3
pkill. E se isso não existisse kill $(pgrep ...),.
Mikel

Eu não estava apenas perguntando por causa desses comandos específicos, mas também para entender melhor o encadeamento de comandos. Mas, como posso ver a partir da pontuação das perguntas, perguntas destinadas a entender não são bem-vindas ...
Tomáš Zato - Restabelecer Monica

Se você quiser tornar a pergunta mais geral e garantir que ela não seja duplicada, posso votar.
Mikel

Desculpe, excluí acidentalmente meu comentário anterior. Estou em um tablet e este site tem botões muito pequenos um ao lado do outro.
Mikel

Eu estava apenas dizendo que diminuí a votação porque sua pergunta não parecia estar perguntando nada do que você não poderia ter aprendido man pgrep. O botão de voto negativo diz que é para quando uma pergunta não mostra nenhum esforço de pesquisa e não consegui ver nada na sua pergunta. Desculpe se isso parecia duro.
Mikel

Respostas:


42

Tente o seguinte:

pgrep name | xargs kill

Se você usar pgrep name | kill, a saída de pgrep nameé feed para stdin de kill. Como killnão lê argumentos do stdin, isso não funcionará.

Usando xargs, ele criará argumentos para a killpartir do stdin. Exemplo:

$ pgrep bash | xargs echo
5514 22298 23079

5
Nada a ver com espaço versus nova linha. Simplesmente porque kill não lê argumentos no stdin.
Mikel

@ Mikel: Meu erro, corrigido.
cuonglm


5

Para responder ao geral e não ao específico ...

Os tubos são para passar a saída de um programa como entrada para outro programa.

Parece que você está tentando usar a saída de um programa como argumentos de linha de comando para outro programa, o que é diferente.

Para fazer isso, use substituição de comando .

Por exemplo, se você deseja executar

sudo kill 5089 5105

E você tem um comando pgrep nameque gera5089 5105

Você os junta como

sudo kill $(pgrep name)

Muito obrigado. Espero que isso ajude outros iniciantes também.
Tomáš Zato - Restabelece Monica
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.