Maneira graciosa de matar o processo


12

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 seleniumEntã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?)

Respostas:


12

Tente usar pkill seleniumse nem isso, nem nenhum dos outros funcionar, você pode continuar usando seu método com outra sequência de pipe, como

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`

O pkill não funciona no meu servidor para isso, mas sua faixa grep aprimorada ajuda muito.
Eric

20

Experimente o pgrepcomando, que exibirá o PID do comando em que você está interessado.

pgrep selenium

Para realmente eliminar o processo, use o pkillcomando complementar .

pkill selenium

Adoro a elegância disso, mas o processo se parece com o seguinte: "root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar "então eu mudei para pgrep javae funciona :-) obrigado!
Eric

2
Se você der ao pgrep o sinalizador '-f', ele corresponderá ao padrão em toda a linha de comando. Então, neste caso matança pgrep -f seleniumdeve funcionar
mills013

7
usar pkillé muito mais simples. pkillusa exatamente o mesmo critério de correspondência que pgrep, portanto, você pode fazer isso em 1 comando em vez de 2 (e tendo que confiar na saída de um).
284 Patrick Patrick

7

Tente usar grep [s]elenium. Isso não encontrará o processo grep.


Este é um truque útil, de fato. Por que isso funciona?

2
@hesse - grepusa BREs por padrão. Ou seja, [e ]mostrar-se em argvpara grep, mas não corresponde porque [e ]não estão sendo usados literalmente por grep.
21412 Chris Down

Eu sempre usei um | grep -v grepcomponente no tubo. Mas isso é bem elegante e eu gosto!
Alexios #

Isso geralmente não é suficiente se você tiver um arquivo no diretório de trabalho atual com o mesmo nome do processo pelo qual está aguardando. Então, a solução que eu uso normalmente é: ps -ef | grep \[s]elenium. Embora eu tenha achado lsofuma alternativa muito melhor ao uso pse grep.
Moreaki 3/17/17

2

O killallcomando não foi mencionado e acho que é uma adição útil ao repertório.

$ killall selenium

Você também pode usar a -r regexopção para especificar uma expressão regular para corresponder ao nome do processo e até mesmo um valor de tempo:

$ killall -o 5m selenium 

Mata todos os processos de selênio com mais de 5 minutos.


Que parece ser exclusivo para não-RHEL / CentOS versõeskillall
ewwhite

0

Use a -m 1opção com o comando grep para buscar apenas o primeiro processo encontrado. Contanto que você classifique seus processos por PID, ascendente, ele funcionará.


1
Você não pode ter certeza de que o processo de selênio está usando um PID mais baixo.
FJRA

FJRA, um processo iniciado anteriormente sempre obtém um PID mais baixo. Como o servidor selenium é iniciado antes do 'grep selenium', ele obtém um PID mais baixo.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.