私は小さな診断ツールを作成しようとしていますが、このツールで実行したい機能の1つは次のとおりです。
ps axu | grep tomcat | grep -v grep | awk '{ print $<list of desired fields> }'
Tomcatを起動したユーザーIDと、Tomcatの起動時に渡された次のパラメータを返したいと思います。
-javaagent:/usr/share/tomcat7/<someagent> -Dcatalina.base=/var/lib/tomcat7
- Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp
このフィールドを配列に渡し、Tomcatのインストールについてユーザーに通知するために使用できます。
問題は、awkを操作するために必要なフィールドを強制的に適用するためのコマンドフォーマットを指定する方法が見つからないことです。
この時点では、出力を取得して一時ファイルに書き込んでから、正規表現を使用して必要なものを抽出しようとしています。
Bashでこれを行う方法があることを知っていますが、ここでは正常に到達できませんでした。
答え1
出力するフィールドを制御する-o
には、オプションを渡します。ps
すべてのフィールドの後にシンボルを追加すると、=
ヘッダー行は省略されます。
主張する-e
代わりに使用ax
基準機能(これはアンティークではなくUNIXに適用されます)。
フィルタがgrep
強力ではありません。たとえば、名前付きスクリプトでこのコマンドを実行すると、look-for-tomcat
スクリプトも一致します。これはorg.apache.catalina.startup.Bootstrap
、パラメータを使用してJVMプロセスを見つけるためのより信頼性の高い方法です。
ps -e -o user=,args= | awk '
$2 ~ /java$/ && / org\.apache\.catalina\.startup\.Bootstrap($| ) {
print "user name: ", $1;
if (match($0, / -javaagent:[^ ]* /)) print substr($0, RSTART+1, RSTART+RLENGTH-2);
# etc.
}'
/var/run/tomcat.pid
より良いアプローチは、起動時にTomcatプロセスのPIDをファイルに書き込むことです(例:)。
答え2
* nixに関する自分の好みがある場合は、/proc
ここから希望のデータを取得できます。私はこれが人間が読めるように退屈な構文解析出力を通過するよりも少し正気であるかもしれないと思います。
tomcat
たとえば、プロセスを開始したユーザーIDを取得するには、次のようにします。
stat -c'%u' /proc/$(pgrep tomcat)/
可用性(および標準化)に依存することは、/proc
特定のアプリケーション/環境/によってはさらに問題になる可能性があります。決定することはあなた次第です。