用于记录 Linux 进程 CPU 和内存使用情况的 Shell 脚本

6
我正在寻找一种记录和图形化显示Linux进程的CPU和RAM使用情况的方法。由于我找不到一个简单的工具来实现这个目标(我尝试过Zabbix和Munin,但安装失败了),所以我开始编写一个Shell脚本来完成这个任务。
该脚本文件通过awk解析top命令的输出,并将其记录到CSV文件中。它:
  1. 通过ps命令找出进程的pid
  2. 使用top和awk记录CPU和内存使用情况。
以下是脚本的样子:
#!/bin/sh
#A script to log the cpu and memory usage of linux processes namely - redis, logstash, elasticsearch and kibana

REDIS_PID=$(ps -ef | grep redis | grep -v grep | awk '{print $2}')

LOGSTASH_PID=$(ps -ef | grep logstash | grep -v grep | awk '{print $2}')

ELASTICSEARCH_PID=$(ps -ef | grep elasticsearch | grep -v grep | awk '{print $2}')

KIBANA_PID=$(ps -ef | grep kibana | grep -v grep | awk '{print $2}')

LOG_FILE=/var/log/user/usage.log
echo $LOG_FILE
top -b | awk -v redis="$REDIS_PID" -v logstash="$LOGSTASH_PID" '/redis|logstash/ {print $1","$9","$10","$12}'

如何:

  1. 打印多个进程的资源使用情况。在awk模式中指定多个变量不起作用。它只会打印第一个pid(在上面的脚本中是redis)的使用情况。
  2. 在打印资源详细信息时打印当前时间戳(通过date +"%T"实现)
  3. 在资源使用情况旁边打印进程名称。在上面的示例中为Redis、Logstash、ElasticSearch或Kibana。
  4. 将上述命令输出重定向到日志文件。我尝试了> $LOG_FILE,但它没有起作用。

有什么想法/输入吗?

提前致谢。

1个回答

6

如果想要找出进程ID,您可以使用pgrep来大大简化脚本:

REDIS_PID=$(pgrep -f redis)

LOGSTASH_PID=$(pgrep -f logstash)

ELASTICSEARCH_PID=$(pgrep -f elasticsearch)

KIBANA_PID=$(pgrep -f kibana)

编辑:抱歉,我不得不离开一段时间,无法提供完整的答案。

为了捕获 top 命令的输出,请使用以下脚本:

while :; do 
  top -n 1 -b | awk -v redis="$REDIS_PID" -v logstash="$LOGSTASH_PID"
         '$1 == redis || $1 == logstash {print $1","$9","$10","$12}' >> $LOG_FILE
  sleep 3
done

这更像是一条附注而不是对问题的回答。 - Chris Seymour
有用但不是答案。 - Andy Dufresne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接