Você percebeu que você tem dois PIDs diferentes nas duas tentativas?
Considere isso: se você digitar um comando como vi raven.txt ,
então ps ax exibirá uma linha que mostra um comando de vi raven.txt .
Da mesma forma, se você digitar um comando como grep snappr ,
então ps ax exibirá uma linha que mostra um comando de grep snappr .
E, se você canalizar a saída desse ps a grep snappr ,
o grep encontrará a linha que está descrevendo a si mesma .
Então, se você digitar
$ ps ax | grep snappr | awk '{print $1}'
repetidamente, imprimirá um número diferente todas as vezes
(porque está imprimindo o PID de grep ,
e você obtém um novo e exclusivo processo grep sempre que executar o comando.
Finalmente, considere: o comando kill não pode ser executado até que seu (s) argumento (s) seja (são) conhecido (s).
Para que seu argumento seja conhecido, o $(ps ax | grep snappr | awk '{print $1}') pipeline
deve ter concluído. Isto implica que o grep deve ter terminado 1 .
Portanto, o kill está recebendo o PID do processo grep ,
mas somente após o processo grep ter terminado -
então, naturalmente, ele relata "Nenhum tal processo".
Talvez eu devesse ter mencionado que não há nenhum processo snappr em execução.
Se houvesse, seu primeiro comando produziria dois números: o PID de snappr ,
e o PID de grep snappr .
Agora, se snappr estivesse em execução, seu comando poderia começar a ser executado semiretamente,
pelo que quero dizer que faz o que você quer, mas também dá uma mensagem de erro.
Se o snappr estiver sendo executado com o PID 42097 e grep snappr for executado com o PID 70848,
então o comando kill será kill 42097 70858 , o que matará o snappr
e receba uma mensagem de erro ao tentar eliminar o processo grep que não existe mais.
Você provavelmente desejará melhorar isso. Meu jeito favorito, que eu inventei 20 anos atrás,
para alterar o grep para grep "[s]nappr" , que corresponderá a snappr , mas não corresponderá a si mesmo.
Outra abordagem é usar pgrep em vez de ps | grep .
1 Alternativamente, o awk poderia terminar se o grep simplesmente fechasse sua stdout.
Esse seria um comportamento muito incomum para um programa * nix.