Buen día a todos,
Estoy intentando escribir un script bash para mostrar todos los procesos de Java, sin embargo, me gustaría que se muestre de la siguiente manera.
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
El problema con lo anterior es que solo muestra un PID en particular.
Entonces quiero ps aux|grep j\[a\]va
obtener el PID de cada uno y luego ejecutar cada PID en el comando anterior.
RESULTADO:
root@reinhardt-VirtualBox:/home/reinhardt# ps -p 1959 -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
PID MEMORY USER GROUP COMMAND ARGS
1959 13648 root root grep grep --color=auto java
Supongo que se creará algún tipo de bucle como el bucle for.
Respuesta1
No en un lugar donde pueda probar esto, pero debería funcionar. read
es una parte estándar de las secuencias de comandos de shell, coloca algo de la entrada estándar (que puede ser una secuencia o un dispositivo como /dev/tty) en una variable. Luego simplemente haces un bucle while
ps auwwx | gawk '/[j]ava/{print $1}' | while read PID
do
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done
O más simplemente, si tu UNIX tiene pgrep:
pgrep java | while read PID
do
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done
A veces puedes utilizar xargs
en casos como estos. Recuerde que, de forma predeterminada, xargs coloca un grupo de argumentos al final del comando. Entonces necesitas alimentarlo uno a la vez (con -n1) y colocar el PID donde quieras, con -i:
pgrep java | xargs -n1 -i{} ps -p {} -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
(Nuevamente, me disculpo si entiendo mal la sintaxis -i, no puedo realizar la prueba ahora. Consulte la página de manual si esto falla)