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.
- Los
grep
filtros que se basan en su cadena de búsqueda [p]
son un truco para evitar que retome el grep
proceso en sí.
- El
awk
solo le da el segundo campo de cada línea, que es el PID.
- La
$(x)
construcción significa ejecutar, x
luego tomar su salida y ponerla en la línea de comando. La salida de esa ps
tubería 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 todos los durmientes.
Explicando el grep '[p]ython csp_build.py'
bit con un poco más de detalle:
Cuando lo sleep 3600 &
sigue ps -ef | grep sleep
, tiende a obtener dos procesos 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'
no creará un proceso con sleep
él, sino que crea grep '[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 es s
) seguido por leep
.
En otras palabras, está buscando sleep
pero el proceso grep es el grep '[s]leep'
que no tiene sleep
.
Cuando alguien de aquí en SO me mostró esto, inmediatamente comencé a usarlo porque
- es un proceso menos que agregar
| grep -v grep
; y
- es elegante y astuto, una combinación rara :-)