Você percebeu que você tem dois PIDs diferentes nas duas tentativas?
Considere isto: se você digitar um comando como vi raven.txt
, então ps ax
irá 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
será exibida uma linha que mostra um comando de grep snappr
. E, se você canalizar a saída desse ps
meio grep snappr
, a grep
encontrará a linha que está descrevendo a si mesmo . Então, se você digitar
$ ps ax | grep snappr | awk '{print $1}'
repetidamente, ele imprimirá um número diferente a cada vez (porque está imprimindo o PID de grep
, e você obtém um grep
processo novo e exclusivo toda vez que executa o comando).
Finalmente, considere: o kill
comando não pode ser executado até que seus argumentos sejam conhecidos. Para que seu argumento seja conhecido, o $(ps ax | grep snappr | awk '{print $1}')
pipeline deve ter sido concluído. Isto implica que o grep
deve ter terminado 1 . Portanto, kill
está sendo dado o PID do grep
processo, mas somente após o grep
processo ter terminado - então, naturalmente, ele reporta "Nenhum tal processo".
Talvez eu devesse ter mencionado que não há snappr
processo 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
estava rodando, seu comando pode começar a rodar semi-corretamente, o que significa que ele faz o que você quer, mas também dá uma mensagem de erro. Se o snappr
está rodando com o PID 42097, e grep snappr
roda com o PID 70848, então o kill
comando será kill 42097 70858
, o que irá matar o snappr
e obter uma mensagem de erro de tentar matar o grep
processo que não existe mais.
Você provavelmente vai querer melhorar isso. Meu jeito favorito, que eu inventei há 20 anos, é mudar o grep
para grep "[s]nappr"
, o qual vai combinar snappr
mas não vai se igualar. Outra abordagem é usar em pgrep
vez de ps | grep
.
1 Alternativamente, o awk
poderia terminar se o grep
meramente fechou sua stdout. Este seria um comportamento muito incomum para um programa * nix.
snappr
estivesse rodando, o primeiro comando teria listado dois PIDs: o dosnappr
e o dogrep
- como explicado na minha resposta, que eu postei meia hora antes de você postar este comentário. ... ... ... ... ... PS Você pode querer revisar suas contribuições um pouco melhor ("Eu afirmo o erro", "ad", "mit").