Quiero matar todos los procesos que obtengo:
ps aux | grep my_pattern
¿Cómo hacerlo?
Esto no funciona:
pkill my_pattern
Quiero matar todos los procesos que obtengo:
ps aux | grep my_pattern
¿Cómo hacerlo?
Esto no funciona:
pkill my_pattern
Respuestas:
Uso pkill -f
, que coincide con el patrón para cualquier parte de la línea de comando
pkill -f my_pattern
pkill
, el error más común es la suposición de que solo una instancia de cada binario podría existir en un momento dado.
killall -m my_pattern
.
pgrep
primero para verificar lo que vas a matar. Puede usar pgrep -l
para ver nombres de procesos o pgrep -a
para ver líneas de comando completas. Utiliza las mismas banderas que pkill. Entonces, en este caso, podrías usar pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
¿Qué está haciendo este código?
El ps -ef
produce una lista de identificadores de proceso en la computadora visible para este usuario. El grep de tubería lo filtra hacia abajo para las filas que contienen esa cadena. El grep -v grep
dicho no coincide en el proceso en sí haciendo el grepping. La impresión awk de tubería dice dividir las filas en el espacio en blanco delimitador predeterminado y filtrar a la segunda columna, que es nuestra identificación de proceso. La tubería Xargs hace girar un nuevo proceso para enviar todos esos pid kill -9
, terminando con todos.
El código anterior es malo, peligroso, feo y hackeo por varias razones.
Si el código que finaliza forzosamente está haciendo operaciones de base de datos o transacciones seguras con condiciones de carrera de baja probabilidad, una fracción del porcentaje del tiempo, la atomicidad de esa transacción se arruinará, produciendo un comportamiento indefinido. kill -9 no toma prisioneros. Si su código es sensible a esto, intente reemplazar la xargs kill
parte con un indicador transmitido que solicite un apagado correcto, y solo si esa solicitud es denegada, el último recurso parakill -9
Existe una posibilidad distinta de cero de que accidentalmente finalice el sistema operativo o provoque un comportamiento indefinido en un proceso no relacionado, lo que lleva a la inestabilidad de todo el sistema porque ps -ef
enumera todos los procesos posibles que podrían existir, y no puede estar seguro de que alguna biblioteca de terceros extraña comparta su nombre del proceso, o que en el tiempo entre leer y ejecutar kill -9, el processid había cambiado a otra cosa, y ahora accidentalmente ha finalizado algún proceso aleatorio que no tenía la intención.
Pero, si comprende los riesgos y los controla con nombres muy únicos, y está de acuerdo con algunas transacciones caídas o corrupción ocasional en los datos, entonces el 99.9% del tiempo estará bien. Si hay un problema, reinicie la computadora, asegúrese de que no haya colisiones de proceso. Es debido a un código como este que hace que el script de soporte técnico: "¿Has intentado reiniciar tu computadora", sea un meme de nivel 5.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
para que xargs no ejecute el comando si no se proporcionan argumentos.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
sin comillas, solo uno de mis procesos en segundo plano se eliminó en la primera ejecución. Ejecutarlo nuevamente mató al resto.
-r
La opción no existe en OS X, por lo que parece.
Si necesita más flexibilidad para seleccionar los procesos, use
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
Puedes usar grep -e etc.
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(observe también la refactorización; vea también mi comentario sobre la respuesta de @ sintetizadorpatel).
ps
devuelve tres procesos 123, 234 y 345, puede kill 123 234 345
igual que puede rm
o cat
múltiples argumentos de archivo.
grep
for KILLPID in
ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
eliminará el grep
puede usar el siguiente comando para enumerar el proceso
ps aux | grep -c myProcessName
si necesita verificar el recuento de ese proceso, ejecute
ps aux | grep -c myProcessName |grep -v grep
después de lo cual puedes matar el proceso usando
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
Si no desea tener dolor de cabeza al encontrar la identificación del proceso, use regexp para eliminar el proceso por nombre. Por ejemplo, para matar a Chrome, el siguiente código hará el truco.
killall -r --regexp chrome
-r
o --regexp
, que son la opción corta y la opción larga GNU, respectivamente.
Puede usar el siguiente comando para:
ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9
o
ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9
Esto funciona para mi.
¿Suena mal?
pkill `pidof myprocess`
ejemplo:
# kill all java processes
pkill `pidof java`
Encontré la mejor manera de hacerlo para un servidor que no admite pkill
kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')
No tienes que hacer un bucle.
que es mejor y más seguro de usar pgrep -f
con kill
, o simplemente pkill -f
, grep
ing ps
salida 's puede ir mal.
A diferencia del uso ps | grep
con el que necesita filtrar la línea grep agregando | grep -v
o usando trucos de patrones, pgrep
simplemente no se seleccionará por diseño.
Además, si su patrón aparece en ps
's UID
/ USER
, SDATE
/ START
o cualquier otra columna, obtendrá procesos no deseados en la salida y los matará, pgrep
+ pkill
no sufra esta falla.
También descubrí que killall -r
/ -regexp
no funcionaba con mi expresión regular.
pkill -f "^python3 path/to/my_script$"
Tomé la respuesta de Eugen Rieck y trabajé con ella. Mi código agrega lo siguiente:
ps ax
incluye grep, así que lo excluí con grep -Eiv 'grep'
He creado un archivo, lo llamé killserver
, aquí va:
#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
if [ ! -z $KILLPID ];then
kill -9 $KILLPID
echo "Killed PID ${KILLPID}"
KILLED=yes
fi
done
if [ -z $KILLED ];then
echo "Didn't kill anything"
fi
Resultados
➜ myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
➜ myapp git:(master) bash killserver
Didn't kill anything
my_pattern
simplemente una subcadena del nombre o contiene caracteres especiales de expresiones regulares?