Linux/Unix Shell Scripting - Duda respecto a procesos

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado 1 puesto en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

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:
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder