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 ps
una llamada a awk
que 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 awk
llamada 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 awk
proceso, ha salido), este awk
proceso ya no existe, por lo tanto, kill
se 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 awk
se 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