我的答案是在“ ps”列表中搜索“ foobar”的典型答案的变体。我相信,“-A”“ ps”的论点比“ aux”更可移植,但是这种变化与答案无关。典型的答案如下所示:
$ ps -A -ww | grep [f]oobar
相反,我使用这种模式:
$ ps -A -ww | grep [^]]foobar
主要优点在于,基于这种模式编写脚本更加容易,因为您只需将静态字符串“ [^]]”与所需的任何模式连接即可。您无需剥离字符串的第一个字母,然后将其插入方括号之间,然后再次将其连接在一起。使用shell脚本编写脚本时,只需将“ [^]]”粘贴到您正在寻找的模式前面就容易了。Bash中的字符串切片是一个丑陋的事情,因此我的修改避免了这种情况。此变化表示在不匹配前导右方括号]的情况下显示模式匹配的线。由于排除方括号的搜索模式实际上会将方括号添加到模式中,因此它永远不会匹配自己。
因此,您可以编写一个可移植的“ psgrep”命令,如下所示。在这里,我考虑了Linux,OS X BSD和其他操作系统之间的差异。这会添加“ ps”中的列标题,提供一种更适合我的需要的自定义“ ps”格式,并显示列出额外,更宽范围的进程,从而不会遗漏任何命令行参数。好吧,大多数都不会错过。Java是Java,它通常以最坏的方式进行操作,因此您某些Java服务将超出进程表将跟踪的参数的最大允许长度。我相信这是1024个字符。允许启动进程的命令单独长度要长得多,但是内核进程表不会费心跟踪任何长度超过1K的内容。启动命令后,命令名称和参数列表为“
psgrep ()
{
pattern=[^]]${1};
case "$(uname -s)" in
Darwin)
ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
Linux)
ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
*) # other UNIX flavors get a minimalist version.
ps -A -ww | grep -i -e ${pattern}
;;
esac
}
ps aux |grep
为pgrep
(或pgrep -f
)。