我正在尝试编写一个小诊断工具,我想要从中运行的功能之一是:
ps axu | grep tomcat | grep -v grep | awk '{ print $<list of desired fields> }'
我想返回启动tomcat的userid以及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
如果您/proc
对 *nix 有自己的喜好,您可以尝试从中获取您想要的数据。我认为这可能比尝试费力地完成供人类阅读的单调乏味的解析输出要理智一些。
例如,要获取启动该tomcat
进程的用户 ID,您可以执行以下操作:
stat -c'%u' /proc/$(pgrep tomcat)/
依赖于可用性(和标准化)/proc
可能会更加麻烦,具体取决于您的特定应用程序/环境/...我想这取决于您的决定。