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.