Duda respecto a procesos
Publicado por Miguel (1 intervención) el 10/12/2018 11:47:44
Buenos días, tengo un pequeño problema, verán tengo que hacer un script en el que me piden lo siguiente (soy principiante en hacer scripts):
Mostrar un listado con todos los usuarios que están ejecutando procesos. En este listado se deben incluir los usuarios reales, los demonios, root, … El listado estará ordenado alfabéticamente, e incluirá el UID del usuario, el GID, el nombre del proceso de este usuario que ha consumido más CPU hasta el momento y el tiempo consumido, además del proceso más antiguo y el tiempo que lleva en ejecución.
El problema es que lo he desarrollado de diversas maneras pero no encuentro el modo de que me lo haga. según eso, yo entiedo que hay que procesar una lista en la que nos salgan dos procesos por usuarios, uno con el mayor %CPU, otro con el más antiguo.
El primero de estos he logrado sacarlo pero me parece bastante tosco:
Eso sería el primero, sin embarga, trato de hacer lo segundo de la misma manera y no logro sacarlo y llevo desde el viernes tratando de averiguar como, en el caso del segundo tengo esto:
Tambié me gustaría saber como ordenar esta lista dependiendo de unas opciones introducidas por parametros que me permitan ordenar por uid, inversamente por uid y nombre, con el parámetro -ut N, eliminar los procesos, con un consumo de CPUsuperior al indicado. El parámetro -ud N eliminará los procesos que lleven en ejecución más del tiempo indicado. esto último tenía pensado hacerlo con un par de bucles comparando el %cpu y haciendo kill del PID si se superaba y lo mismo con el tiempo,
La selección por parametros ya la tengo y solo me faltan las lineas de comando, aunque en verdad con lo primero que pedí estaría contento y ya sería tratar de sacar lo otro por mi cuenta a ver si sale, aunque si pudieran facilitar, no el codigo sino el como hacerlo, estaría mejor para así entenderlo.
La cosa es, ¿habría una manera más simple de hacer todo esto (y que funcione)?, espero una respuesta, y gracias de antemano.
Mostrar un listado con todos los usuarios que están ejecutando procesos. En este listado se deben incluir los usuarios reales, los demonios, root, … El listado estará ordenado alfabéticamente, e incluirá el UID del usuario, el GID, el nombre del proceso de este usuario que ha consumido más CPU hasta el momento y el tiempo consumido, además del proceso más antiguo y el tiempo que lleva en ejecución.
El problema es que lo he desarrollado de diversas maneras pero no encuentro el modo de que me lo haga. según eso, yo entiedo que hay que procesar una lista en la que nos salgan dos procesos por usuarios, uno con el mayor %CPU, otro con el más antiguo.
El primero de estos he logrado sacarlo pero me parece bastante tosco:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PROCESOS="$(ps --no-headers -eo user,uid,gid,pid,%cpu,cputime,etimes,cmd:20 --sort user | sort -d > lista.txt)"
CABECERA="$(ps -eo user,uid,gid,pid,%cpu,cputime,etimes,cmd:20 | head -1)"
#procesos con mayor % de cpu / usuario
#cabecera
echo "$CABECERA"
for usuario in $(awk '{print $1}' lista.txt | uniq);do
contador=1
CPU_ACTUAL="$(cat lista.txt|head -$contador | tail -1 > cpu_actual.txt )"
for usuario_comparador in $(awk '{print $1}' lista.txt);do
((contador=contador+1))
CPU_SIGUIENTE="$(cat lista.txt|head -$contador | tail -1 > cpu_siguiente.txt)"
if [[ $usuario = $usuario_comparador ]];then
cpu_actual=$(awk '{print $5}' cpu_actual.txt | tr -d '.' | sed 's/^0*//')
cpu_siguiente=$(awk '{print $5}' cpu_siguiente.txt | tr -d '.' | sed 's/^0*//')
if [[ "$cpu_siguiente" > "$cpu_actual" ]];then
cat cpu_siguiente.txt > cpu_actual.txt
fi
fi
done
cat cpu_actual.txt >> ficherofinal.txt
done
rm cpu_actual.txt
rm cpu_siguiente.txt
Eso sería el primero, sin embarga, trato de hacer lo segundo de la misma manera y no logro sacarlo y llevo desde el viernes tratando de averiguar como, en el caso del segundo tengo esto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for usuario in $(awk '{print $1}' lista.txt | uniq);do
contador=1
ETIME_ACTUAL="$(cat lista.txt | head -$contador |tail -1 > etime_actual.txt)"
for comparador in $(awk '{print $1}' lista.txt);do
((contador=contador + 1))
ETIME_SIGUIENTE="$(cat lista.txt |head -$contador |tail -1 > etime_siguiente.txt)"
if [[ $usuario = $comparador ]];then
etime_actual=$(awk '{print $7}' etime_actual.txt)
etime_siguiente=$(awk '{print $7}' etime_siguiente.txt)
if [[ "$etime_siguiente" -gt "$etime_actual" ]];then
cat etime_siguiente.txt > etime_actual.txt
fi
fi
done
cat etime_actual.txt >> ficherofinal.txt
done
rm etime_actual.txt
rm etime_siguiente.txt
cat ficherofinal.txt |sort -d
rm ficherofinal.txt
Tambié me gustaría saber como ordenar esta lista dependiendo de unas opciones introducidas por parametros que me permitan ordenar por uid, inversamente por uid y nombre, con el parámetro -ut N, eliminar los procesos, con un consumo de CPUsuperior al indicado. El parámetro -ud N eliminará los procesos que lleven en ejecución más del tiempo indicado. esto último tenía pensado hacerlo con un par de bucles comparando el %cpu y haciendo kill del PID si se superaba y lo mismo con el tiempo,
La selección por parametros ya la tengo y solo me faltan las lineas de comando, aunque en verdad con lo primero que pedí estaría contento y ya sería tratar de sacar lo otro por mi cuenta a ver si sale, aunque si pudieran facilitar, no el codigo sino el como hacerlo, estaría mejor para así entenderlo.
La cosa es, ¿habría una manera más simple de hacer todo esto (y que funcione)?, espero una respuesta, y gracias de antemano.
Valora esta pregunta


0