Ich versuche, ein Skript zu erstellen, das als ps-Befehl mit eigenen Eigenschaften fungiert, die ich anzeigen möchte. Sagen wir, so würden Prozesse im ps-Befehl aussehen:
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
Ich möchte wie folgt anzeigen:
UID PID APPNAME
sas 24431 -Dapp.name=myApp
sas 24432 -Dapp.name=myApp2
sas 24433 -Dapp.name=myApp3
Hinweis: der app.name
Eigenschaft ist ein Befehlsargument, das aus dem Befehl ps extrahiert wird
Dies ist mein Skript:
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;
Im Moment funktioniert es so wie ich es will. Aber manchmal wird die Ausrichtung geschraubt. Kann dieses Skript auch in einen Einzeilenbefehl optimiert werden?
Jede Hilfe wäre willkommen.
Akzeptierte Antwort:
Kann dieses Skript auch in einen Einzeilenbefehl optimiert werden?
Ich würde die Verwendung des -o
in Betracht ziehen Option des ps
Befehl, (soweit möglich) nur die interessierenden Felder auszugeben und diese dann nachzubearbeiten, damit sie mit java
übereinstimmen Prozesse und bestimmte Befehlsargumente, die Sie benötigen – so etwas wie
ps -u $USER -o uname=,pid=,args= |
gawk -vOFS='t' '/java/ {print $1,$2,substr($0,match($0,"-D(app[.]name)|(projectName)[^[:space:]]*"),RLENGTH)}'
oder vielleicht so etwas in perl
(HAFTUNGSAUSSCHLUSS:Meine Perl-Kenntnisse sind lückenhaft )
ps -u $USER -o uname=,pid=,args= |
perl -anle 'print join "t", @F[0], @F[1], grep /-D(app[.]name)|(projectName)/,@F if /java/'