Encuentra y elimina un proceso en una línea usando bash y regex

A menudo necesito matar un proceso durante la progtwigción.

La forma en que lo hago ahora es:

[~]$ ps aux | grep 'python csp_build.py' user 5124 1.0 0.3 214588 13852 pts/4 Sl+ 11:19 0:00 python csp_build.py user 5373 0.0 0.0 8096 960 pts/6 S+ 11:20 0:00 grep python csp_build.py [~]$ kill 5124 

¿Cómo puedo extraer la identificación del proceso automáticamente y matarlo en la misma línea?

Me gusta esto:

 [~]$ ps aux | grep 'python csp_build.py' | kill  

En bash , deberías poder hacer:

 kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}') 

Los detalles sobre su funcionamiento son los siguientes:

  • El ps te da la lista de todos los procesos.
  • El grep filtra eso basado en su cadena de búsqueda, [p] es un truco para evitar que elija el proceso grep real.
  • El awk solo te da el segundo campo de cada línea, que es el PID.
  • El constructo $(x) significa ejecutar x luego tomar su salida y ponerlo en la línea de comando. La salida de esa tubería ps dentro de esa construcción anterior es la lista de ID de proceso, por lo que terminas con un comando como kill 1234 1122 7654 .

Aquí hay una transcripción que lo muestra en acción:

 pax> sleep 3600 & [1] 2225 pax> sleep 3600 & [2] 2226 pax> sleep 3600 & [3] 2227 pax> sleep 3600 & [4] 2228 pax> sleep 3600 & [5] 2229 pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}') [5]+ Terminated sleep 3600 [1] Terminated sleep 3600 [2] Terminated sleep 3600 [3]- Terminated sleep 3600 [4]+ Terminated sleep 3600 

y puedes verlo terminando a todos los durmientes.


Explicar el bit grep '[p]ython csp_build.py' con un poco más de detalle:

Cuando sleep 3600 & seguido por ps -ef | grep sleep ps -ef | grep sleep , tiendes a tener dos procesos con sleep , el sleep 3600 y el grep sleep (porque ambos tienen sleep en ellos, eso no es ciencia espacial).

Sin embargo, ps -ef | grep '[s]leep' ps -ef | grep '[s]leep' no creará un proceso con sleep en él, en su lugar crea grep '[s]leep' y aquí está el grep '[s]leep' : grep no lo encuentra porque está buscando la expresión regular “any carácter de la clase de caracteres [s] (que es s ) seguido de leep .

En otras palabras, está buscando sleep pero el proceso grep es grep '[s]leep' que no tiene sleep .

Cuando me mostraron esto (por alguien aquí en SO), inmediatamente comencé a usarlo porque

  • es un proceso menos que agregar | grep -v grep | grep -v grep ; y
  • es elegante y furtivo, una combinación rara 🙂

si tienes pkill,

 pkill -f csp_build.py 

Si solo desea grep contra el nombre del proceso (en lugar de la lista de argumentos completa), entonces deje de -f .

Un trazador de líneas:

 ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9 
  • Imprima la columna 2: awk '{print $2}'
  • sudo es opcional
  • Ejecutar kill -9 5124 , kill -9 5373 etc. (kill -15 es más elegante, pero un poco más lento)

Prima:

También tengo 2 funciones de acceso directo definidas en mi .bash_profile (~ / .bash_profile es para osx, debes ver qué funciona para tu máquina * nix).

  1. palabra clave p
    • lista todos los P rocesses que contienen palabra clave
    • uso, por ejemplo: p csp_build , p python etc.

código bash_profile:

 # FIND PROCESS function p(){ ps aux | grep -i $1 | grep -v grep } 
  1. palabra clave ka
    • Todos los procesos que tienen esta palabra clave
    • uso, por ejemplo: ka csp_build , ka python etc.
    • nivel de muerte opcional, por ejemplo: ka csp_build 15 , ka python 9

código bash_profile:

 # KILL ALL function ka(){ cnt=$( p $1 | wc -l) # total count of processes found klevel=${2:-15} # kill level, defaults to 15 if argument 2 is empty echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. " p $1 echo -e '\nTerminating' $cnt 'processes .. ' ps aux | grep -i $1 | grep -v grep | awk '{print $2}' | xargs sudo kill -klevel echo -e "Done!\n" echo "Running search again:" p "$1" echo -e "\n" } 

Intenta usar

 ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill 
 killall -r regexp -r, --regexp 

Interpreta el patrón del nombre del proceso como una expresión regular extendida.

Solo puede usar pkill '^python*' para matar el proceso regex.

Si quieres ver lo que vas a matar o encontrar antes de matar simplemente usa pgrep -l '^python*' donde -l también muestra el nombre del proceso. Si no quiere usar pkill , use solo:

pgrep '^python*' | xargs kill

puedes hacerlo con awk y backtics

 ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'` 

$ 2 en awk imprime la columna 2, y los backtics ejecutan la statement que se imprime.

Pero una solución mucho más limpia sería que el proceso de Python almacenara su identificación de proceso en / var / run y luego simplemente pudieras leer ese archivo y matarlo.

Use pgrep, disponible en muchas plataformas:

 kill -9 `pgrep -f cps_build` 

pgrep -f devolverá todos los PID con coincidencia “cps_build”

Mi tarea fue matar todo lo que coincida con la expresión regular que se coloca en el directorio específico (después de las pruebas de selenium no todo se detuvo). Esto funcionó para mí:

 for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done 

Para matar el proceso por palabra clave midori , por ejemplo:

kill -SIGTERM $(pgrep -i midori)

Un método que usa solo awk (y ps ):

 ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }' 

Al utilizar pruebas de igualdad de cadenas evito que coincida con este proceso.

 ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15 

Give -f to pkill

 pkill -f /usr/local/bin/fritzcap.py 

La ruta exacta del archivo .py es

 # ps ax | grep fritzcap.py 3076 pts/1 Sl 0:00 python -u /usr/local/bin/fritzcap.py -c -d -m 

Empecé a usar algo como esto:

 kill $(pgrep 'python csp_build.py') 

Matar nuestros propios procesos comenzados a partir de un PPID común es bastante frecuente, pkill asociado a la bandera –P es un ganador para mí. Usando el ejemplo de @ ghostdog74:

 # sleep 30 & [1] 68849 # sleep 30 & [2] 68879 # sleep 30 & [3] 68897 # sleep 30 & [4] 68900 # pkill -P $$ [1] Terminated sleep 30 [2] Terminated sleep 30 [3]- Terminated sleep 30 [4]+ Terminated sleep 30 

No necesita el cambio de usuario para ps.

 kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'` 

En algunos casos, me gustaría matar procesos de esta manera:

  Sleep ~ dormir 1000 y
 [1] 25410
 Sleep ~ dormir 1000 y
 [2] 25415
 Sleep ~ dormir 1000 y
 [3] 25421
 Pid ~ pidof sueño
 25421 25415 25410
 ➜ ~ kill 'pidof sleep`
 [2] - 25415 finalizó el sueño 1000                                                             
 [1] - 25410 finalizó el sueño 1000
 [3] + 25421 suspensión finalizada 1000 

Pero, creo que es un poco inapropiado en tu caso. (Puede que estén corriendo python a, python b, python x … en segundo plano).

Lo uso para matar a Firefox cuando se trata de slammed slammed y cpu bashing 🙂 Reemplazar ‘Firefox’ con la aplicación que desea morir. Estoy en el shell Bash – OS X 10.9.3 Darwin.

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)

Yo uso gkill processname , donde gkill es el siguiente script:

 cnt=`ps aux|grep $1| grep -v "grep" -c` if [ "$cnt" -gt 0 ] then echo "Found $cnt processes - killing them" ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill else echo "No processes found" fi 

NOTA: NO matará los procesos que tienen “grep” en sus líneas de comando.

El siguiente comando será útil:

kill $(ps -elf | grep | awk {'print $4'})

por ej., ps -elf | grep top ps -elf | grep top

  0 T ubuntu 6558 6535 0 80 0 - 4001 signal 11:32 pts/1 00:00:00 top 0 S ubuntu 6562 6535 0 80 0 - 2939 pipe_w 11:33 pts/1 00:00:00 grep --color=auto top 

kill -$(ps -elf | grep top| awk {'print $4'})

  -bash: kill: (6572) - No such process [1]+ Killed top 

Si el proceso todavía está atascado, use la extensión “-9” para hardkill, de la siguiente manera:

kill -9 $(ps -elf | grep top| awk {'print $4'})

Espero que ayude…!

Encuentra y elimina todos los procesos en una línea en bash.

 kill -9 $(ps -ef | grep '' | grep -v 'grep' | awk {'print $2'}) 
  • ps -ef | grep '' ps -ef | grep '' – Da la lista de los detalles del proceso en ejecución (uname, pid, etc.) que coincide con el patrón. La lista de salida incluye este comando grep que también lo busca. Ahora, para matar, necesitamos ignorar este proceso de comando grep .
  • ps -ef | grep '' | grep -v 'grep' ps -ef | grep '' | grep -v 'grep' – Agregar otro grep con -v 'grep' elimina el proceso grep actual.
  • Luego, usando awk obtenga la identificación del proceso solo.
  • Luego mantenga este comando dentro de $(...) y páselo para kill comando, para matar todo el proceso.

Puede usar el comando below para listar pid del comando. Use top o mejor use htop para ver todo el proceso en Linux. Aquí quiero matar a un proceso llamado

 ps -ef | grep '/usr/lib/something somelocation/some_process.js' | grep -v grep | awk '{print $2}' 

Y verifica el pid. Debe ser apropiado. Para matarlos usa el comando de matar.

 sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js' | grep -v grep | awk '{print $2}'` 

Por ejemplo: – es de la lista de procesos de htop.

 sudo kill -9 `ps -ef | grep '' | grep -v grep | awk '{print $2}'` 

Esto resuelve mis problemas. Siempre esté preparado para reiniciar el proceso si mata accidentalmente un proceso.