Ich verwende ps -ef | grep catalina | grep -v grep
zum Drucken des auf dem System laufenden Tomcat-Prozesses:
kshitiz 7099 1 0 May11 ? 00:02:29 /usr/lib/jvm/jdk1.8.0/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:38156 -Dcatalina.base=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1 -Dcatalina.home=/opt/tomcat-7.0.42 -Dwtp.deploy=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps -Djava.endorsed.dirs=/opt/tomcat-7.0.42/endorsed -Dfile.encoding=UTF-8 -classpath /opt/tomcat-7.0.42/bin/bootstrap.jar:/opt/tomcat-7.0.42/bin/tomcat-juli.jar:/usr/lib/jvm/jdk1.8.0/lib/tools.jar org.apache.catalina.startup.Bootstrap start
Dann verwende ich ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
zum Extrahieren der Prozess-ID:
7099
Aber wenn ich den gesamten Befehl mit einem Alias verknüpfe alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"
und ihn über den Alias verwende, wird der gesamte Text gedruckt und awk
es scheint nicht zu funktionieren.
type tomcat_id
gibt:
tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''
Antwort1
Eine allgemeine Regel für Aliase: Wenn es für einen Alias zu komplex wird, verwenden Sie stattdessen eine Funktion.
tomcat_id () {
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}
Das Problem mit Ihrer Aliasdefinition ist, dass Sie die Anführungszeichen falsch gesetzt haben. Die Zeile, die den Alias definiert, ist ein Shell-Befehl und wird von der Shell analysiert. Da Sie doppelte Anführungszeichen verwendet haben und es zu diesem Zeitpunkt wahrscheinlich keine Positionsparameter gibt (also $2
zu einer leeren Zeichenfolge erweitert wird), lautet der von Ihnen definierte Alias
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'
Die einfache Möglichkeit, einen Alias zu definieren, besteht darin, einfache Anführungszeichen für die Definition zu verwenden und die Verwendung einfacher Anführungszeichen im Alias-Befehl zu vermeiden. Wenn ich schon dabei bin, habe ich entfernt -F " "
, was ohnehin die Standardeinstellung ist (und ein bisschen seltsam, weil es wie „ein Leerzeichen“ aussieht, aber „jede beliebige Folge von Leerzeichen“ bedeutet).
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'
Oder Sie können verwenden, '\''
um effektiv ein einfaches Anführungszeichen innerhalb eines in einfache Anführungszeichen gesetzten Literals zu zitieren.
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'
Aber wie ich oben geschrieben habe, verwenden Sie eine Funktion, das ist klarer. Oder besser gesagt, verwenden Sie das für die Aufgabe geeignete Werkzeug:
alias tomcat_id='pgrep catalina'
oder
alias tomcat_id='pidof catalina'
Antwort2
Die Antwort von Gnouc ist vollkommen gültig (weshalb ich sie positiv bewertet habe), aber ich möchte eine Alternative anbieten:
alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"
Die Idee besteht hier darin, dass wir im Prozessnamen (Feld 8) java
und in der gesamten Zeile finden können sollten catalina
.
Also überlassen wir Ihnen awk
die ganze Arbeit des Abgleichens und Druckens. Sie brauchen sich nicht darum zu kümmern grep
;)
Also die Bedeutung:
$8 ~ /java/ && /catalina/ {print $2}
ist, das Feld $8
mit dem regulären Ausdruck abzugleichen /java/
und die ganze Zeile (könnte auch $0
explizit verwendet werden) mit dem regulären Ausdruck abzugleichen /catalina/
und, wenn diese Dinge zutreffen, das Feld auszudrucken $2
. Denken Sie daran, was bereits in Gnoucs Antwort gesagt wurde: Das Standardtrennzeichen ist bereits ein Leerzeichen. Dies muss nicht definiert werden.
Antwort3
Sie müssen das Dollarzeichen im awk
Befehl maskieren:
alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk '{print \$2}'"
Und Sie müssen nicht verwenden -F' '
, awk
verwenden Sie Leerzeichen als Standardfeldtrennzeichen.