validate - Encuentra y elimina un proceso en una línea usando bash y regex
regex text between tags (22)
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 - Ejecute
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, tienes que ver qué funciona para tu máquina * nix).
- p palabra clave
- Enumera todos los P que contienen palabras 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
}
- palabra clave ka
- K ills A ll procesa esta palabra clave.
- uso, por ejemplo:
ka csp_build
,ka python
etc. - nivel de eliminación 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"
}
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 matarlo en la misma línea?
Me gusta esto:
[~]$ ps aux | grep ''python csp_build.py'' | kill <regex that returns the pid>
Comencé a usar algo como esto:
kill $(pgrep ''python csp_build.py'')
Dar -f a 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
El siguiente comando será útil:
kill $(ps -elf | grep <process_regex>| awk {''print $4''})
por ejemplo, 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 sigue bloqueado, use la extensión "-9" para hardkill, de la siguiente manera:
kill -9 $(ps -elf | grep top| awk {''print $4''})
Espero que ayude...!
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 filtros
grep
que se basan en su cadena de búsqueda,[p]
es un truco para evitar que retire el proceso real degrep
. - El
awk
solo le da el segundo campo de cada línea, que es el PID. - La construcción
$(x)
significa ejecutarx
luego tomar su salida y colocarla en la línea de comando. La salida de esa tuberíaps
dentro de la construcción anterior es la lista de ID de procesos, por lo que terminas con un comando comokill 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 lo puedes ver terminando todos los durmientes.
Explicando 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 los dos tienen sleep
, eso no es ciencia espacial).
Sin embargo, ps -ef | grep ''[s]leep''
ps -ef | grep ''[s]leep''
no creará un proceso con el sleep
, sino que crea grep ''[s]leep''
y aquí está el grep ''[s]leep''
: el grep
no lo encuentra porque está buscando la expresión regular "cualquier Carácter de la clase de caracteres [s]
(que es s
) seguido de un 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 astuto, una combinación rara :-)
En algunos casos, me gustaría matar procesos simultáneamente de esta manera:
➜ ~ sleep 1000 & [1] 25410 ➜ ~ sleep 1000 & [2] 25415 ➜ ~ sleep 1000 & [3] 25421 ➜ ~ pidof sleep 25421 25415 25410 ➜ ~ kill `pidof sleep` [2] - 25415 terminated sleep 1000 [1] - 25410 terminated sleep 1000 [3] + 25421 terminated sleep 1000
Pero, creo que es un poco inapropiado en tu caso. (Puede que estén ejecutando python a, python b, python x ... en el fondo).
Encuentra y mata todos los procesos en una sola línea en bash.
kill -9 $(ps -ef | grep ''<exe_name>'' | grep -v ''grep'' | awk {''print $2''})
-
ps -ef | grep ''<exe_name>''
ps -ef | grep ''<exe_name>''
: proporciona la lista de detalles del proceso en ejecución (uname, pid, etc.) que coincide con el patrón. La lista de salida incluye este comandogrep
que también lo busca. Ahora para matar necesitamos ignorar este proceso de comandogrep
. -
ps -ef | grep ''<exec_name>'' | grep -v ''grep''
ps -ef | grep ''<exec_name>'' | grep -v ''grep''
: agregar otro grep con-v ''grep''
elimina el proceso actual de grep. - Entonces usando
awk
obtén el identificador de proceso solo. - Luego, mantenga este comando dentro de
$(...)
y páselo al comandokill
, para eliminar todo el proceso.
Intenta usar
ps aux | grep ''python csp_build.py'' | head -1 | cut -d " " -f 2 | xargs kill
Matar nuestros propios procesos iniciados a partir de un PPID común es bastante frecuente, pkill asociado a la –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
Mi tarea fue eliminar 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 se detuvo todo) 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
No necesitas el cambio de usuario para ps.
kill `ps ax | grep ''python csp_build.py'' | awk ''{print $1}''`
Para matar proceso por palabra clave midori
, por ejemplo:
kill -SIGTERM $(pgrep -i midori)
Puede usar el siguiente comando para enumerar el pid del comando. Use top o mejor use htop para ver todos los procesos en linux. Aquí quiero matar un proceso llamado
ps -ef | grep ''/usr/lib/something somelocation/some_process.js'' | grep -v grep | awk ''{print $2}''
Y verificar el pid. Debe ser apropiado. Para matarlos, use el comando kill.
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 htop.
sudo kill -9 `ps -ef | grep ''<process>'' | grep -v grep | awk ''{print $2}''`
Esto resuelve mis problemas. Siempre esté preparado para reiniciar el proceso si accidentalmente mata un proceso.
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 el backtics ejecuta la declaración que se imprimió.
Pero una solución mucho más limpia sería que el proceso de Python almacenara su ID de proceso en / var / run y luego simplemente puede leer ese archivo y eliminarlo.
Puedes usar solo pkill ''^python*''
para matar el proceso de expresiones regulares.
Si desea ver lo que matará o encontrará antes de matarlo, simplemente use pgrep -l ''^python*''
donde -l muestra también el nombre del proceso. Si no quieres usar pkill
, usa solo:
pgrep ''^python*'' | xargs kill
Un método que usa solo awk
(y ps
):
ps aux | awk ''$11" "$12 == "python csp_build.py" { system("kill " $2) }''
Mediante el uso de pruebas de igualdad de cadenas, evito hacer coincidir este proceso.
Use pgrep - disponible en muchas plataformas:
kill -9 `pgrep -f cps_build`
pgrep -f devolverá todos los PID con coincidencia "cps_build"
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 eliminará los procesos que tengan "grep" en sus líneas de comando.
Utilizo esto para matar a Firefox cuando se está cerrando de golpe el script y golpeando a la CPU :) Reemplaza ''Firefox'' con la aplicación que quieres 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)
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), deje de -f
.
killall -r regexp
-r, --regexp
Interprete el patrón de nombre de proceso como una expresión regular extendida.
ps -o uid,pid,cmd|awk ''{if($1=="username" && $3=="your command") print $2}''|xargs kill -15