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

发布于 2024-12-14 07:37:30 字数 743 浏览 0 评论 0原文

我需要知道有多少进程正在为特定任务运行(例如 Apache tomcat 的数量),如果是 1,则打印 PID。否则打印一条消息。

我在 BASH 脚本中需要这个,现在当我执行类似的操作时:

result=`ps aux | grep tomcat | awk '{print $2}' | wc -l`

将项目数分配给结果。欢呼!但我没有 PID。然而,当我尝试将其作为中间步骤执行时(没有卫生间),我遇到了问题。因此,如果我这样做:

result=`ps aux | grep tomcat | awk '{print $2}'`

我修改变量结果的任何尝试似乎都不起作用。我尝试过 set 和 tr (用换行符替换空格),但我只是无法得到正确的结果。理想情况下,我希望变量结果是一个数组,其中 PID 作为单独的元素。然后我可以轻松地看到大小、元素。

谁能建议我做错了什么? 谢谢, Phil

更新:

我最终使用了以下语法:

pids=(`ps aux | grep "${searchStr}"| grep -v grep | awk '{print $2}'`)
number=${#pids[@]}

关键是将括号放在反引号命令周围。现在变量 pids 是一个数组,可以询问长度和元素。

感谢 choroba 和 Dimitre 的建议和帮助。

I need to know how many processes are running for a specific task (e.g. number of Apache tomcats) and if it's 1, then print the PID. Otherwise print out a message.

I need this in a BASH script, now when I perform something like:

result=`ps aux | grep tomcat | awk '{print $2}' | wc -l`

The number of items is assigned to result. Hurrah! But I don't have the PID(s). However when I attempt to perform this as an intermediary step (without the wc), I encounter problems. So if I do this:

result=`ps aux | grep tomcat | awk '{print $2}'`

Any attempts I make to modify the variable result just don't seem to work. I've tried set and tr (replace blanks with line-breaks), but I just cannot get the right result. Ideally I'd like the variable result to be an array with the PIDs as individual elements. Then I can see size, elements, easily.

Can anyone suggest what I am doing wrong?
Thanks,
Phil

Update:

I ended up using the following syntax:

pids=(`ps aux | grep "${searchStr}"| grep -v grep | awk '{print $2}'`)
number=${#pids[@]}

The key was putting the brackets around the back-ticked commands. Now the variable pids is an array and can be asked for length and elements.

Thanks to both choroba and Dimitre for their suggestions and help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寂寞清仓 2024-12-21 07:37:30
pids=($(
    ps -eo pid,command |
    sed -n '/[t]omcat/{s/^ *\([0-9]\+\).*/\1/;p}'
))
number=${#pids[@]}

pids=( ... ) 创建一个数组。
$( ... ) 将其输出作为字符串返回(类似于反引号)。
然后,在所有进程的列表上调用 sed:对于包含 tomacat 的行([t] 防止包含 sed 本身),仅保留并打印 pid。

pids=($(
    ps -eo pid,command |
    sed -n '/[t]omcat/{s/^ *\([0-9]\+\).*/\1/;p}'
))
number=${#pids[@]}

pids=( ... ) creates an array.
$( ... ) returns its output as a string (similar to backquote).
Then, sed is called on the list of all the processes: for lines containing tomacat (the [t] prevents the sed itself from being included), only the pid is preserved and printed.

深白境迁sunset 2024-12-21 07:37:30

您可能需要调整pgrep命令(您可能需要也可能不需要-f选项)。

_pids=( 
  $( pgrep -f tomcat )
  )

(( ${#_pids[@]} == 1 )) &&
  echo ${_pids[0]} ||
    echo message  

如果您想打印pid的数量(带有消息):

_pids=(
  $( pgrep -f tomcat )
  )

(( ${#_pids[@]} == 1 )) &&
  echo ${_pids[0]} ||
    echo "${#_pids[@]} running"

应该注意pgrep实用程序和使用的语法不是标准 >。

You may need to adjust the pgrep command (you may need or may not need the -f option).

_pids=( 
  $( pgrep -f tomcat )
  )

(( ${#_pids[@]} == 1 )) &&
  echo ${_pids[0]} ||
    echo message  

If you want to print the number of pids (with a message):

_pids=(
  $( pgrep -f tomcat )
  )

(( ${#_pids[@]} == 1 )) &&
  echo ${_pids[0]} ||
    echo "${#_pids[@]} running"

It should be noted that the pgrep utility and the syntax used are not standard.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文