我需要知道为特定任务运行了多少进程(例如Apache tomcats的数量),如果它是1,则打印PID。否则打印出一条消息。
我需要在BASH脚本中使用它,现在我执行类似的操作:
result=`ps aux | grep tomcat | awk '{print $2}' | wc -l`
将项目数分配给结果。欢呼!但我没有PID。但是,当我尝试将其作为中间步骤(没有wc)执行时,我遇到了问题。所以,如果我这样做:
result=`ps aux | grep tomcat | awk '{print $2}'`
我为修改变量结果所做的任何尝试似乎都不起作用。我尝试过set和tr(用换行符替换空格),但我无法得到正确的结果。理想情况下,我希望变量结果是一个以PID为单个元素的数组。然后我可以很容易地看到尺寸,元素。
有谁能建议我做错了什么? 谢谢, 菲尔
更新
我最终使用以下语法:
pids=(`ps aux | grep "${searchStr}"| grep -v grep | awk '{print $2}'`)
number=${#pids[@]}
关键是将括号放在后面勾选的命令周围。现在变量pids是一个数组,可以询问长度和元素。
感谢choroba和Dimitre的建议和帮助。
答案 0 :(得分:1)
您可能需要调整 pgrep 命令(您可能需要或不需要 -f 选项)。
_pids=(
$( pgrep -f tomcat )
)
(( ${#_pids[@]} == 1 )) &&
echo ${_pids[0]} ||
echo message
如果您想打印 pids 的数量(带消息):
_pids=(
$( pgrep -f tomcat )
)
(( ${#_pids[@]} == 1 )) &&
echo ${_pids[0]} ||
echo "${#_pids[@]} running"
应该注意, pgrep 实用程序和使用的语法不是标准。
答案 1 :(得分:1)
pids=($(
ps -eo pid,command |
sed -n '/[t]omcat/{s/^ *\([0-9]\+\).*/\1/;p}'
))
number=${#pids[@]}
pids=( ... )
创建一个数组。
$( ... )
将其输出作为字符串返回(类似于反引号)。
然后,在所有进程的列表中调用sed:对于包含tomacat的行([t]
阻止包含sed本身),只保留并打印pid。