Estoy tratando de crear un script que actúe como un comando ps con sus propias propiedades que quiero mostrar. Digamos que así es como se verían los procesos en el comando ps:
sas 24431 1 0 Oct10 ? 00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
Quiero mostrar lo siguiente:
UID PID APPNAME
sas 24431 -Dapp.name=myApp
sas 24432 -Dapp.name=myApp2
sas 24433 -Dapp.name=myApp3
app.name
propiedad es un argumento de comando que se extrae del comando ps
Este es mi guión:
echo -e "PIDtUSERIDttAPPNAME"
ps -u $USER -f |grep "java"|grep -v "grep"|
while read LINE
do
#Get pid from the line
PID=$(cut -d" " -f2 <<< $LINE);
#Get parameter value called "-Dapp.name or -DprojectName"
#from the ps command for the process
APPNAME=$(ps -f $PID | awk 'BEGIN {RS=" "}; /-Dapp.name|-DprojectName/');
USERID=$(cut -d" " -f1 <<< $LINE);
echo -e $PID"t"$USERID"t"$APPNAME;
done;
Ahora mismo funciona como yo quiero. Pero a veces la alineación se jode. ¿También se puede optimizar este script en un comando de línea?
Cualquier ayuda sería apreciada.
Respuesta aceptada:
¿También se puede optimizar este script en un comando de línea?
Consideraría usar -o
opción del ps
comando para generar (en la medida de lo posible) solo los campos de interés, y luego procesarlos para que coincidan con java
procesos y argumentos de comando específicos que necesita, algo así como
ps -u $USER -o uname=,pid=,args= |
gawk -vOFS='t' '/java/ {print $1,$2,substr($0,match($0,"-D(app[.]name)|(projectName)[^[:space:]]*"),RLENGTH)}'
o tal vez algo como esto en perl
(DESCARGO DE RESPONSABILIDAD:mi conocimiento de Perl es incompleto )
ps -u $USER -o uname=,pid=,args= |
perl -anle 'print join "t", @F[0], @F[1], grep /-D(app[.]name)|(projectName)/,@F if /java/'