【问题标题】:top and grep output nothing when run from shell script从 shell 脚本运行时,top 和 grep 不输出任何内容
【发布时间】:2020-03-05 23:40:19
【问题描述】:

我正在尝试创建 ssh 到远程服务器的 shell 脚本,并在那里运行脚本并在本地服务器中打印输出,但是当我在本地服务器中运行脚本时,它大部分时间什么都不输出,很少输出数据:

Mule: CPU > % RAM > %

当我在本地服务器中通过命令行 ssh 到远程服务器并运行脚本时,它会在命令行中正常输出:

Mule: CPU > 39.0% RAM > 8.1%

本地服务器中的脚本

#!/bin/bash
echo -e '\r' 
echo 'leg3'
echo -e '\r'
ssh  -qT appread@${remote} << EOF
source /home/appread/Process_mon.sh 
exit
EOF

远程服务器中的脚本:

#!/bin/bash
mulecpu=$(top -b -n 1 -c  | grep  -P '.*[j]ava.*mule.*'|  awk '{print $9}')
muleram=$(top -b -n 1 -c  | grep -P '.*[j]ava.*mule.*'|  awk '{print $10}')
m=$(echo 'Mule: CPU > '$mulecpu'% RAM > '$muleram'% ')
echo $m

【问题讨论】:

  • top 是一种交互式工具,其输出不是标准定义的,并且可以在操作系统和单个操作系统的版本之间进行转换。它适用于人类读者,而不是程序化消费。
  • (和 grep -P 根本不保证工作,因为并非所有版本的 grep 都是针对 libpcre 编译的;仅在 grep -E 不够好时使用它 - 但在此情况下,您根本不需要它,因为awk 只能搜索与模式本身匹配的行)。
  • 未指定工具的行为未指定。那里有点重言式。我强烈(非常,非常强烈!)建议以不同的方式监控行为。
  • 例如,您的服务器是否使用systemd?如果是这样,它会为每个服务创建一个 cgroup。您可以轻松地询问操作系统内核(通过/proc)cgroup 正在使用多少内存,或者每个进程曾经在其中使用了多少 CPU 周期。
  • ...比较在给定时间采集的两个样本之间的 CPU 时间计数,考虑到您的硬件拥有的 CPU 数量,您就可以得到 - 您可以自己计算的百分比,不需要解析根本没有定义其输出格式的工具的输出。

标签: linux bash shell grep


【解决方案1】:

如果您在没有-w 的情况下运行top,其输出可能会被截断,因此您的grep 可能会失败。

添加-w 512或类似的以最大化输出的宽度:

#!/bin/bash

top -b -n 1 -c -w 512 |\
awk '/[j]ava.*mule/ { printf "Mule: CPU > %s%% RAM > %s%%\n",$9,$10 }'


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多