【发布时间】: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 数量,您就可以得到 - 您可以自己计算的百分比,不需要解析根本没有定义其输出格式的工具的输出。