#!/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
这可能不是最复杂的解决方案,但是 - 特别是如果您没有其他进程打开这么多套接字 - 您可以检查输出
(n:无名称解析,t:TCP,u:UDP,p:显示 PID 和程序 - 根据您的进程是否打开 UDP 或 TCP 连接,您可能只想提供 u 或 t 之一)。
您可以从输出中获取 pid:
其中“12345”应替换为您的 PID,“progname”应替换为您的进程名称。grep 的选项 -c 对匹配进行计数。您可能希望细化搜索以更准确地匹配您的需求(例如,仅包括 ESTABLISHED 连接)。
'lsof' 也可能是你的朋友。你可以试试
并检查输出并做一些 grepping。查看 lsof 手册页,看看您是否可以修改输出格式以更好地适应脚本解析。
您可以编写一个简单的脚本来定期运行该命令。对于大量连接,您最好尝试运行 netstat 或 lsof 占用多少资源并调整间隔。例如每分钟一次(默认):
(相当没用,只是提供给想法)。
如果你想要警报和监控,那么我会看Nagios,如果你想要纯图表,那么我会看Munin或Cacti。如果您只想知道一个进程在任何时候打开了多少个连接,请使用 lsof。
您可以使用现成的解决方案ps-watcher
你的配置可以是这样的:
当进程计数超过阈值时,这将向您发送邮件。第二部分有一个不同的正则表达式匹配相同的进程名称,它记录进程的计数。由于它不受任何触发器的限制,因此该操作在每次 ps-watcher 检查时运行。您可以使用“--sleep 150”选项将检查间隔更改为 ps-watcher。
如果您不想安装完整的 Nagios(或其他)来监控单个进程,为什么不自己编写一个脚本来完成呢?我已经做了类似的事情来跟踪我们其中一个盒子的数据库连接,使用 netstat 的输出进行计数并将结果记录到文件中。如果计数 > 3000,则添加额外的几行以发送电子邮件应该是微不足道的。
我会安装 munin 并编写一个插件来监视特定进程或服务的特定行为。