如何监控单个进程?

如何监控单个进程?

我需要监控单个进程(例如,当建立的连接数超过 3000 个时发出警告)并收集其统计信息(例如,确定今天凌晨 1:20 建立了多少个连接,此时服务器运行速度太慢,正如客户所说)。我应该使用什么工具?

答案1

如果您不想安装完整的 Nagios(或其他程序)来监控单个进程,为什么不自己编写一个脚本来做这件事呢?我做过类似的事情来跟踪我们其中一个盒子的数据库连接,使用 netstat 的输出进行计数并将结果记录到文件中。如果计数 >3000,添加几行代码来发送电子邮件应该很简单。

答案2

这可能不是最复杂的解决方案,但是 - 特别是如果你没有其他进程打开这么多套接字 - 你可以检查输出

netstat -nutp

(n:无名称解析,t:TCP,u:UDP,p:显示 PID 和程序 - 您可能只想根据您的进程是否打开 UDP 或 TCP 连接来提供 u 或 t 中的一个)。

您可以从输出中 grep 查找 pid:

netstat -nutp | grep -c ' 12345/progname$'

其中“12345”应替换为您的 PID,而“progname”应替换为您的进程名称。grep 的选项 -c 会计算匹配项。您可能希望优化搜索以更准确地满足您的需求(例如,仅包括 ESTABLISHED 连接)。

'lsof' 也可能是你的朋友。你可以尝试

lsof -p 12345 -a -i4

检查输出并进行一些 grepping。查看 lsof 手册页,看看是否可以修改输出格式以更好地适应脚本解析。

您可以编写一个简单的脚本来定期运行该命令。对于大量连接,您最好试验一下运行 netstat 或 lsof 需要多少资源并调整间隔。例如每分钟一次(默认情况下):

#!/bin/sh

prog=progname

if [ -z "$1" ]; then
     interval=60
else
     interval="$1"
fi

pid=$(pidof $prog)
while :; do
    n=$(netstat -nutp | grep -c " ${pid}/${prog}$')
    date +"Number of connections [%Y-%m-%d %H:%M:%S]: $n" > connection.log
    if [ "$n" -gt $TRESHOLD ]; then
       # warn the admin
    fi
    sleep "${interval}"
done

(没什么用,仅提供想法)。

答案3

如果你需要警报和监控,那么我会看看纳吉奥斯如果你想要纯图表,那么我会看看穆宁或者仙人掌。如果您只想知道某个进程在任意时刻打开了多少个连接,那么使用 lsof。

答案4

我会安装 munin 并编写一个插入监控某个服务的特定进程或者特定行为。

相关内容