Depois que meu script bash é feito com o servidor selenium, o script mata assim:
kill `ps -ef | grep selenium | awk '{ print $2 }'`
Enquanto isso funciona e mata o script selenium, ele também tenta matar o processo para grep selenium
Então, quando o número do processo retorna ao comando kill, o processo desaparece e, portanto, acaba gerando uma mensagem de erro. (Em outras palavras: acaba matando dois processos, um deles é o verdadeiro servidor de selênio, o outro é um processo fugaz que é um efeito colateral de como estou executando esse comando.)
Existe uma maneira mais elegante de matar o processo, que não tenha esse efeito colateral não intencional?
(FWIW, uma idéia que tive: esse mesmo script inicia o selênio no início do script; talvez, se houvesse uma maneira de capturar o PID ao iniciar o selênio, eu poderia simplesmente mantê-lo e matá-lo diretamente, em vez de esperar por o ID do processo. O problema é que eu não sei como obter esse PID, como usar uma variável para mantê-lo e como referenciá-lo posteriormente no script. Mas essa é a melhor maneira de fazer isso?)
Experimente o
pgrep
comando, que exibirá o PID do comando em que você está interessado.Para realmente eliminar o processo, use o
pkill
comando complementar .fonte
pgrep java
e funciona :-) obrigado!pgrep -f selenium
deve funcionarpkill
é muito mais simples.pkill
usa exatamente o mesmo critério de correspondência quepgrep
, portanto, você pode fazer isso em 1 comando em vez de 2 (e tendo que confiar na saída de um).Tente usar
grep [s]elenium
. Isso não encontrará o processo grep.fonte
grep
usa BREs por padrão. Ou seja,[
e]
mostrar-se emargv
paragrep
, mas não corresponde porque[
e]
não estão sendo usados literalmente porgrep
.| grep -v grep
componente no tubo. Mas isso é bem elegante e eu gosto!ps -ef | grep \[s]elenium
. Embora eu tenha achadolsof
uma alternativa muito melhor ao usops
egrep
.O
killall
comando não foi mencionado e acho que é uma adição útil ao repertório.Você também pode usar a
-r regex
opção para especificar uma expressão regular para corresponder ao nome do processo e até mesmo um valor de tempo:Mata todos os processos de selênio com mais de 5 minutos.
fonte
killall
Use a
-m 1
opção com o comando grep para buscar apenas o primeiro processo encontrado. Contanto que você classifique seus processos por PID, ascendente, ele funcionará.fonte