Elimine las instancias en ejecución de procesos, excepto la que se activa debido al comando actual ejecutado.

Elimine las instancias en ejecución de procesos, excepto la que se activa debido al comando actual ejecutado.

Tengo que eliminar todas las instancias en ejecución de Xvfb usando el script de Shell, por lo tanto, tengo el siguiente código:

for pid in $(ps -ef | awk '/Xvfb/ {print $2}'); do kill -9 $pid; done

Elimina todas las instancias, pero una falla con el siguiente error:

kill: (142898) - No such process

Parece que el comando ejecutado anteriormente crea una instancia más pero que ya no existe al matar. En este caso, ¿cómo puedo saltarme eso y tener éxito con el guión?

Respuesta1

El problema es que está canalizando la salida de psuna llamada a awkque busca la cadena "Xvfb" y por lo tanto también contiene la cadena "Xvfb" en su propia línea de comandos. Debido a que ambos procesos de una tubería se ejecutan simultáneamente, la awkllamada en sí también se registrará en la salida de ps(pruebe lo que sucede si simplemente escribe ps -ef | awk '/Xvfb/'en la línea de comandos).

Sin embargo, cuando se inicia el ciclo (lo que sucede cuando la sustitución del comando $( … )y, por lo tanto, también el awkproceso, ha salido), este awkproceso ya no existe, por lo tanto, killse topa con esto.

Debería estar seguro si modifica el comando en la sustitución del comando a

ps -ef | awk '$0 ~ /Xvfb/ && index($0,"awk")==0 {print $2}'

lo que garantizará que ningún comando que contenga la subcadena awkse incluya en la lista.

Respuesta2

Estás intentando matar el awk.

Un truco simple de expresiones regulares para evitar esto es utilizar algún tipo de escape. Como wor[d].

Entonces, para su código (con comillas variables agregadas)

for pid in $(ps -ef | awk '/Xvf[b]/ {print $2}'); do kill -9 "$pid"; done

información relacionada