Foros del Web » Administración de Sistemas » Unix / Linux »

Pasar argumentos desde el proceso ps a otro

Estas en el tema de Pasar argumentos desde el proceso ps a otro en el foro de Unix / Linux en Foros del Web. Hola a todos, Resulta que tengo un script que toma como argumento el pid de un proceso e imprime por pantalla en formato de columnas ...
  #1 (permalink)  
Antiguo 05/10/2014, 09:21
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 3 meses
Puntos: 0
Pasar argumentos desde el proceso ps a otro

Hola a todos,
Resulta que tengo un script que toma como argumento el pid de un proceso e
imprime por pantalla en formato de columnas el PID, PPID, ESTADO y COMANDO que ejecuta dicho proceso.

Es decir esto:

PID PPID ESTADO COMANDO
8900 8880 S bash

Y ahora lo que necesito es otro script que proporcione al script anterior todos los
PID de los procesos del sistema, para que imprima su información.

El primer script es este:

Código BASH:
Ver original
  1. #!/bin/bash
  2. #inf_process
  3.  
  4. #echo -e "PID\tPPID\tESTADO\tCOMANDO\n"
  5.  
  6. #awk '/^Pid/ { printf $1 } /PPid/ { print $1 } /State/ { printf $1 } /Name/ { printf $1 }' /proc/$1/status
  7.  
  8.  
  9.  
  10. #awk '/^Pid/ { printf $2 } /PPid/ { print $2 } /State/ { printf $2 } /Name/ { printf $2 }' /proc/$1/status
  11.  
  12. awk '/^Pid/ { printf $1}' /proc/$1/status
  13. echo -en "\t"
  14. awk '/PPid/ { printf $1}' /proc/$1/status
  15. echo -en "\t"
  16. awk '/State/ { printf $1}' /proc/$1/status
  17. echo -en "\t"
  18. awk '/Name/ { print $1}' /proc/$1/status
  19.  
  20. awk '/^Pid/ { printf  $2}' /proc/$1/status
  21. echo -en "\t"
  22. awk '/PPid/ { printf  $2}' /proc/$1/status
  23. echo -en "\t"
  24. awk '/State/ { printf  $2}' /proc/$1/status
  25. echo -en "\t"
  26. awk '/Name/ { print  $2}' /proc/$1/status

Alguna idea de como hacer el otro.
La unica forma que se me ocurre es obtener del comando ps los PID ,almacenarlos en un array ,recorre el array e ir ejecutando el primer script pasandole el PID,pero no se si esto se puede hacer en los script.

Saludos y Gracias
  #2 (permalink)  
Antiguo 10/10/2014, 08:25
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Pasar argumentos desde el proceso ps a otro

Holas,
Primero que nada, creo que el siguiente comando hace lo mismo que tu primer script:
Código BASH:
Ver original
  1. ps -e -o pid,ppid,state,comm
Segundo, permíteme simplificar tu código, en caso de que quieras seguir usándolo. El programa AWK que sigue hace lo mismo que tus 8 llamadas a AWK arriba:
Código BASH:
Ver original
  1. awk '
  2. BEGIN {
  3.        print "PID\tPPID\tESTADO\tCOMANDO";
  4.        pid="";
  5.        ppid="";
  6.        state="";
  7.        name="";
  8. }
  9. /^Pid/ { pid=$2 }
  10. /PPid/ { ppid=$2 }
  11. /State/ { state=$2 }
  12. /Name/ { name=$2 }
  13. END {
  14.        print pid "\t" ppid "\t" status "\t" name
  15. }'

Seguramente se puede escribir un programa que lea todos los archivos e imprima una línea por cada uno, pero al menos este lee un archivo e imprime el resumen en una sola llamada a AWK.

BASH soporta arrays, pero es necesario entender cómo funcionan, y no es la forma usual de lidiar con múltiples argumentos o con cadenas separadas por espacios. En general las soluciones con for o xargs son mucho más claras y se adaptan mejor a cómo funciona la shell.

Ya que no estás usando ps (si lo usaras, el comando que escribí arriba sería todo lo que necesitás), y que estás leyendo de /proc, considera usar algo como esto:
Código BASH:
Ver original
  1. for STATUS_FILE in /proc/*/status; do
  2.    # llamada a AWK
  3. done

Esto recorre todos los archivos cuyo nombre sea 'status' y que se encuentren en un directorio hijo (1 solo nivel) de /proc. Corres el riesgo de que exista un archivo que cumpla eso y no pertenezca a un proceso, pero por lo que sé no hay nada en /proc que cumpla esa regla y no sea el archivo de estado de un proceso. Para estar seguro, podrías cambiar el * arriba por [0-9]*, con lo cual en vez de aceptar cualquier nombre en el directorio hijo de /proc, solamente permites nombres que comiencen con un número.


Saludos.

Etiquetas: argumentos, bash, proceso
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:57.