Forma elegante de matar el proceso

12

Después de que mi script bash se realiza con el servidor de selenio, el script lo mata así:

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

Si bien esto funciona y mata el script de selenio, también trata de matar el proceso de grep seleniummodo que cuando el número de proceso vuelve al comando kill, el proceso se ha ido, por lo que termina generando un mensaje de error. (En otras palabras: termina matando dos procesos, uno de ellos es el servidor de selenio real, el otro es un proceso fugaz que es un efecto secundario de cómo estoy haciendo este comando).

¿Hay alguna forma más elegante de matar el proceso, que no tenga este efecto secundario no deseado?

(FWIW una idea que tenía: este mismo script inicia selenio antes en el script, así que tal vez si hubiera una forma de capturar el PID cuando inicie selenio, podría mantenerlo y matarlo directamente, en lugar de buscar el ID del proceso. El problema es que no sé cómo obtener ese PID, cómo usar una variable para mantenerlo y cómo hacer referencia a él más adelante en el script. Pero, ¿es esa una mejor manera de hacerlo?)

Eric
fuente

Respuestas:

12

Intente usar pkill seleniumsi ni esto ni ninguno de los otros funcionan, puede seguir usando su método con otra secuencia de tuberías como

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`
Momo
fuente
pkill no funciona en mi servidor para esto, pero su tira de grep mejorada ayuda mucho.
Eric
20

Pruebe el pgrepcomando, que generará el PID del comando que le interesa.

pgrep selenium

Para matar realmente el proceso, use el pkillcomando complementario .

pkill selenium
mills013
fuente
Me encanta la elegancia de esto, pero el proceso se ve así: "root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar ", así que lo cambié pgrep javay funciona :-) ¡gracias!
Eric
2
Si le da a pgrep la bandera '-f', hará coincidir el patrón con toda la línea de comandos. Entonces, en este caso, kill pgrep -f seleniumdebería funcionar
mills013
77
usar pkilles mucho más simple. pkillutiliza exactamente los mismos criterios de coincidencia que pgrep, por lo que puede hacer esto en 1 comando en lugar de 2 (y tener que confiar en la salida de uno).
Patrick
7

Intenta usar grep [s]elenium. Esto no encontrará el proceso grep.

BillThor
fuente
Este es un truco útil, de hecho. Por que funciona
2
@hesse: greputiliza BRE de forma predeterminada. Es decir, [y ]se muestran en argvpara grep, pero no coincide debido [y ]no están siendo utilizados por literalmente grep.
Chris Down
A menudo he usado un | grep -v grepcomponente en la tubería. ¡Pero esto es bastante elegante y me gusta!
Alexios
Esto (a menudo) no es suficiente si tiene un archivo en el directorio de trabajo actual con el mismo nombre que el proceso que está buscando. Por lo tanto, la solución que normalmente uso es: ps -ef | grep \[s]elenium. Aunque encontré lsofque era una alternativa mucho mejor para usar psy grep.
Moreaki
2

El killallcomando no se ha mencionado, y creo que es una adición útil al repertorio.

$ killall selenium

También puede usar la -r regexopción para especificar una expresión regular que coincida con el nombre del proceso e incluso un valor de tiempo:

$ killall -o 5m selenium 

Mata todos los procesos de selenio anteriores a 5 minutos.

kwarrick
fuente
Eso parece ser exclusivo de las versiones no RHEL / CentOS dekillall
ewwhite
0

Use el -m 1interruptor con el comando grep para obtener solo el primer proceso encontrado. Siempre que ordene sus procesos por PID, ascendente, funcionará.

holadanylo
fuente
1
No puede estar seguro de que el proceso de selenio esté usando un PID más bajo.
FJRA
FJRA, un proceso iniciado antes siempre tiene un PID más bajo. Debido a que el servidor de selenio se inicia antes del 'grep selenium', obtendrá un PID más bajo.
holadanylo