我正面对以下bash脚本:
#! /bin/bash
processname=$1
x=1
while [ $x -eq 1 ] ; do
ps -el | grep $processname | awk ' {if($15!="grep") print "The memory consumed by the process " $15 " is = "$9} ' >> out.log
sleep 30
done
我正在运行:
$ ./myscript.sh Firefox
但是当我在文件中看到输出时,除firefox
进程外,我还获取了/bin/bash
进程的信息
The memory consumed by the process /Applications/Firefox.app/Contents/MacOS/firefox is = 911328
The memory consumed by the process /bin/bash is = 768
有人可以帮助我,这样我只想获得与Firefox进程相关的信息,而不是其他任何东西(/bin.bash等)
答案 0 :(得分:3)
常见的诀窍是将grep Firefox
更改为grep [F]irefox
。在这种情况下,您可以使用
ps | grep '['${processname:0:1}']'${processname:1}
答案 1 :(得分:2)
这是正常的,因为$processname
是Firefox
。由于您的命令也监视它,因此有一个进程使用它。
例如,尝试ps -el | grep Firefox
,您将获得两个匹配的流程行(如果您有一个Firefox运行实例),一个是Firefox,另一个是寻找Firefox的grep命令。
在grep -v /bin/bash'
中管道输出应解决此问题。例如:
ps -el | grep $processname | awk ...
变为:
ps -el | grep $processname | grep -v 'grep' | awk ...
答案 2 :(得分:1)
你打电话
ps -el | grep $processname | awk ' {if($15!="grep") print "The memory consumed by the process " $15 " is = "$9} '
这意味着你运行awk并将其输入与grep的输出连接起来。然后启动grep并输出ps -el作为输入。
当bash启动ps时,你有grep和awk运行。
解决方案:运行ps -el并记住它的输出。然后运行grep和awk。它应该是这样的:
ps -el > ps.tmp
grep $processname ps.tmp | awk ' {if($15!="grep") print "The memory consumed by the process " $15 " is = "$9} ' >> out.log
可能这可以在不使用tmp文件的情况下完成。像TMP=$(ps -el)
一样。但我不知道如何在变量