枚举具有给定名称的正在运行的进程数 - 分配给变量

时间:2011-11-07 22:03:13

标签: arrays bash ubuntu

我需要知道为特定任务运行了多少进程(例如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的建议和帮助。

2 个答案:

答案 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。