por que a saída piping pgrep para kill não está funcionando

1

Estou brincando com canos para aprender como usá-los. Eu estou tentando este comando para matar um processo pelo nome: pgrep <some_process> | kill

mas a saída que estou recebendo é a instrução de uso para kill, como se ela não tivesse recebido nenhuma entrada.

é claro que sei que há uma maneira mais fácil de realizar a mesma tarefa como pkill ou killall , mas quero saber por que isso não está funcionando.

Obrigado

    
por Mhd.Tahawi 02.11.2014 / 09:54

3 respostas

3

kill não está lendo nada de stdin, mas espera alguns argumentos de linha de comando e lança um erro se não os obtiver.

O encanamento só funciona se o programa no lado direito do tubo estiver realmente lendo do tubo. Nem todos os programas fazem.

    
por Florian Diesch 02.11.2014 / 10:06
2

Como Florian explicou, kill espera entradas de linha de comando.

Para contornar o problema, você pode usar

  • xargs para criar argumentos de linha de comando para um comando, por exemplo, pgrep vivaldi | xargs kill ou melhor ainda pgrep vivaldi | awk 'BEGIN{ORS=" "} 1' | xargs kill
  • substituição do shell: kill $(pgrep vivaldi)
  • killall , que faz praticamente o mesmo trabalho que pgrep e kill combinados, por exemplo, killall vivaldi
  • pkill , outro utilitário para matar com base no nome, por exemplo, pkill vivaldi
por Sergiy Kolodyazhnyy 01.10.2015 / 06:58
0

Para matar um programa pelo nome, se você realmente souber o nome do processo, basta usar o comando skill <your process name> ;

Agora, para canais, uma boa maneira de entendê-los é brincar com ferramentas como echo , more , less , tail , head etc. Há muitos programas que podem ser lidos um cachimbo ... um que eu sempre usei é grep .

    
por Carlos Escobar 01.10.2015 / 06:46