A menudo necesito matar un proceso durante la programació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 eliminarla en la misma línea?
Me gusta esto:
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
Respuestas:
En
bash
, deberías poder hacer:Los detalles sobre su funcionamiento son los siguientes:
ps
te da la lista de todos los procesos.grep
filtros que se basan en su cadena de búsqueda[p]
son un truco para evitar que retome elgrep
proceso en sí.awk
solo le da el segundo campo de cada línea, que es el PID.$(x)
construcción significa ejecutar,x
luego tomar su salida y ponerla en la línea de comando. La salida de esaps
tubería dentro de esa construcción anterior es la lista de ID de proceso, por lo que terminas con un comando comokill 1234 1122 7654
.Aquí hay una transcripción que lo muestra en acción:
y puedes verlo terminando todos los durmientes.
Explicando el
grep '[p]ython csp_build.py'
bit con un poco más de detalle:Cuando lo
sleep 3600 &
sigueps -ef | grep sleep
, tiende a obtener dos procesossleep
, elsleep 3600
y elgrep sleep
(porque ambos tienensleep
en ellos, eso no es ciencia espacial).Sin embargo,
ps -ef | grep '[s]leep'
no creará un proceso consleep
él, sino que creagrep '[s]leep'
y aquí está la parte difícil:grep
no lo encuentra porque está buscando la expresión regular "cualquier carácter de la clase de caracteres[s]
(que ess
) seguido porleep
.En otras palabras, está buscando
sleep
pero el proceso grep es elgrep '[s]leep'
que no tienesleep
.Cuando alguien de aquí en SO me mostró esto, inmediatamente comencé a usarlo porque
| grep -v grep
; yfuente
kill
se producirá con la salida estándarkill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
grep '[p]ython csp_build.py'
que también se puede utilizar:kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}')
.grep -v
devuelve líneas no coincidentes.si tienes pkill
Si solo desea grep contra el nombre del proceso (en lugar de la lista completa de argumentos), deje de lado
-f
.fuente
pgrep
ypkill
trabaje siempre que tenga cuidado de especificar el proceso correctamente. Por defecto, solo se corresponde con el nombre del proceso , que casi con certeza es solo "python" en este caso. Usepgrep -f "python csp_build.py"
para hacer coincidir el comando completo.pkill -9 -f csp_build.py
Un trazador de líneas:
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
awk '{print $2}'
sudo
es opcionalkill -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, tienes que ver qué funciona para tu máquina * nix).
p csp_build
,p python
etc.código bash_profile:
ka csp_build
,ka python
etc.ka csp_build 15
,ka python 9
código bash_profile:
fuente
source ~/.bash_profile
en el shell actual para importar las nuevas funciones (esto es lo que prefiero).grep
. Recuerde, cualquier cosa que parezcagrep x | awk '{ y }'
generalmente es mejor y, a menudo, más robusta si la reemplaza conawk '/x/ { y }'
Interprete el patrón de nombre de proceso como una expresión regular extendida.
fuente
Intenta usar
fuente
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs kill
trabajó para mi. graciasgrep
posible, y la mayor parte de manera simple y elegante. El caso trivial degrep x y | awk '{ z }'
siempre está mejor escritoawk '/x/ { z }' y
; vea también el uso inútil degrep
.Puede usar solo
pkill '^python*'
para matar el proceso de expresiones regulares.Si quieres ver lo que vas a matar o encontrar antes de matar, solo usa
pgrep -l '^python*'
where -l salidas también nombre del proceso. Si no quieres usarpkill
, usa solo:pgrep '^python*' | xargs kill
fuente
Use pgrep, disponible en muchas plataformas:
pgrep -f devolverá todos los PID con coincidencia "cps_build"
fuente
pgrep
, también tendráspkill
. Como siempre, no lo use akill -9
menos que sepa por quékill -15
(el valor predeterminado) okill -2
no funcionará.-9
y utiliza la sintaxis de sustitución de comandos moderna adecuada. Vota eso en su lugar; aunque, por supuesto, lapkill
respuesta es mejor aún.-9
realmente significa.Esto devolverá solo el pid
Entonces, para matar cualquier proceso en una línea:
o, si conoce el nombre exacto del proceso, también puede probar pidof:
Pero, si no conoce el nombre exacto del proceso,
pgrep
sería mejor.Si hay varios procesos ejecutándose con el mismo nombre, y desea eliminar el primero, entonces:
También tenga en cuenta que, si le preocupa la mayúsculas y minúsculas, puede agregar la opción -i como en grep. Por ejemplo:
Más información sobre señales y pgrep en
man 7 signal
oman signal
yman pgrep
fuente
puedes hacerlo con awk y backtics
$ 2 en awk imprime la columna 2, y el backtics ejecuta la declaración que se imprime.
Pero una solución mucho más limpia sería que el proceso de Python almacene su ID de proceso en / var / run y luego simplemente puede leer ese archivo y matarlo.
fuente
Mi tarea fue matar todo lo que coincida con la expresión regular que se coloca en un directorio específico (después de las pruebas de selenio, no todo se detuvo). Esto funcionó para mí:
fuente
-9
opción dekill
es quizás demasiado agresiva. No les permite liberar sus recursos.kill
acepta múltiples procesos, por lo que el bucle es básicamente inútil; y como se indica en otra parte de esta página, no debe usarlo akill -9
menos que sepa que el proceso no responderá solokill
.Para matar el proceso por palabra clave
midori
, por ejemplo:kill -SIGTERM $(pgrep -i midori)
fuente
Un método que usa solo
awk
(yps
):Al usar la prueba de igualdad de cadenas, evito que este proceso coincida.
fuente
fuente
ps
con la-o
opción.Dale -f a pkill
la ruta exacta del archivo .py es
fuente
Empecé a usar algo como esto:
fuente
Matar nuestros propios procesos comenzados desde un PPID común es bastante frecuente, pkill asociado a la
–P
bandera es un ganador para mí. Usando el ejemplo @ ghostdog74:fuente
No necesita el cambio de usuario para ps.
fuente
En algunos casos, me gustaría matar procesos simultáneamente de esta manera:
Pero, creo que es un poco inapropiado en su caso (puede estar ejecutando python a, python b, python x ... en segundo plano).
fuente
Si
pkill -f csp_build.py
no elimina el proceso, puede agregarlo-9
para enviar una señal de interrupción que no se ignorará. es decirpkill -9 -f csp_build.py
fuente
La solución sería filtrar los procesos con un patrón exacto, analizar el pid y construir una lista de argumentos para ejecutar procesos de eliminación:
Explicación de la documentación:
Ejemplo :
fuente
Lo uso para matar a Firefox cuando se está bloqueando el script y el ataque de la CPU :) Reemplace '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)
fuente
grep Firefox | awk 'NR == 1 { next } ...'
conawk 'NR == 1 || $11 !~ /Firefox/ { next } ...'
no sólo ahorra un proceso, sino que también mejora la precisión. Tampoco es difícil deshacerse desort | uniq
Awk puro (uniq | sort
aunque, por supuesto, es simplemente incorrecto: perderá cualquier duplicado que no sea adyacente y ocultará el error al ordenar innecesariamente la salida deuniq
).Yo uso
gkill processname
, donde gkill es el siguiente script:NOTA: NO matará los procesos que tienen "grep" en sus líneas de comando.
fuente
grep
y otros antipatterns comunes de script de shell.El siguiente comando será útil:
kill $(ps -elf | grep <process_regex>| awk {'print $4'})
p.ej.,
ps -elf | grep top
kill -$(ps -elf | grep top| awk {'print $4'})
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...!
fuente
Encuentra y elimina todos los procesos en una línea en bash.
ps -ef | grep '<exe_name>'
- Da la lista de detalles del proceso en ejecución (uname, pid, etc.) que coincide con el patrón. La lista de salida también incluye estegrep
comando que lo busca. Ahora para matar necesitamos ignorar estegrep
proceso de comando.ps -ef | grep '<exec_name>' | grep -v 'grep'
- Agregar otro grep con-v 'grep'
elimina el proceso grep actual.awk
solo la identificación del proceso.$(...)
y páselo alkill
comando, para matar todo el proceso.fuente
Puede usar el siguiente comando para enumerar pid del comando. Use top o mejor use htop para ver todos los procesos en linux. Aquí quiero matar un proceso llamado
Y verificar el pid. Debe ser apropiado. Para matarlos, use el comando kill.
Por ejemplo: - es de la lista de procesos htop.
Esto resuelve mis problemas. Siempre esté preparado para reiniciar el proceso si accidentalmente termina un proceso.
fuente