ps -ef | grep catalina | grep -v grep
システムで実行されているTomcatプロセスを印刷するために使用します。
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
次にそれを使用してps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
プロセスIDを抽出します。
7099
しかし、コマンド全体にエイリアスを追加してalias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"
エイリアスを使用すると、テキスト全体が印刷され、awk
機能しないようです。
type tomcat_id
以下を提供します。
tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''
答え1
エイリアスの一般的な規則:エイリアスがエイリアスと比較して複雑すぎる場合は、代わりに関数を使用してください。
tomcat_id () {
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}
エイリアス定義の問題は、誤って引用したことです。エイリアスを定義する行は、シェルによって解析されるシェルコマンドです。二重引用符を使用し、当時は位置引数がなかったので(したがって空の$2
文字列に展開されます)、定義したエイリアスは次のようになります。
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'
エイリアスを定義する簡単な方法は、定義に一重引用符を使用し、aliasコマンドで一重引用符を使用しないことです。これを行うと、とにかくデフォルト値を削除しました-F " "
(「空白」のように見えますが、「空白のシーケンス」を意味するので少し奇妙です)。
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'
あるいは、'\''
単一引用符を使用して、単一引用符リテラル内で効果的に引用することもできます。
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'
しかし、上記のように関数を使用する方がはるかに明確です。または、作業に適したツールを使用してください。
alias tomcat_id='pgrep catalina'
または
alias tomcat_id='pidof catalina'
答え2
Gnoucの答えは完全に有効ですが(だから私が投票しました)、代替案を提示したいと思います。
alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"
ここでのアイデアは、プロセス名(フィールド8)内でを見つけることができなければならず、行java
全体でを見つける必要があることですcatalina
。
だから我々はawk
すべてのマッチングと印刷ジョブを完了しました。気にする必要はありませんgrep
;)
だからそれは次のことを意味します:
$8 ~ /java/ && /catalina/ {print $2}
正規表現と一致し、行全体(明示的に使用することもできます)を正規表現と一致し、その項目がtrueの場合にフィールドを印刷するフィールド$8
。 Gnoucが答えですでに言ったことを覚えておいてください。デフォルトの区切り文字はすでに空白です。これを定義する必要はありません。/java/
$0
/catalina/
$2
答え3
次のコマンドでドル記号をエスケープする必要がありますawk
。
alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk '{print \$2}'"
そして、必ずしもデフォルトのフィールド区切り文字としてスペースを使用する-F' '
必要はありません。awk