使用 Linux Shell 脚本定时记录 TCP 连接数

近期 Ricky 这边有一台 CentOS Linux 7.5 的服务器,整个操作系统的 TCP 连接数会无缘无故暴涨至三、四千,过一段时间又回落至正常水平。为了便于分析该问题的原因 Ricky 写了一个 Linux Shell 脚本,当整个操作系统的 TCP 连接数高于 200 个的时候自动将 netstat -anp 命令的执行结果保存到日志文件,脚本每 30 秒自动执行一次。

部署:

1、编写脚本,在命令行界面输入:

[root@host ~]# vi /root/tcp_collect.sh

键入小写字母 i ,进入编辑模式,将以下脚本复制粘贴进去(请根据实际需要进行相应地修改):

#!/bin/bash
let TCP=`netstat -anp | grep tcp | wc -l`
if [ $TCP -gt 200 ]; then
        netstat -anp > /root/tcp_connection/tcp_$(date "+%F-%H-%M-%S").txt
fi

按一次 ESC 键退出编辑模式,然后键入 “ :wq ” 保存并退出。

2、为上述脚本赋予可执行权限,并创建用于存储日志文件的文件夹:

[root@host ~]# chmod +x /root/tcp_collect.sh
[root@host ~]# mkdir /root/tcp_connection/

3、让上述脚本每 30 秒钟自动运行一次,在命令行界面输入:

[root@host ~]# crontab -e

先键入大写字母 G ,跳到最后一行;再键入小写字母 o ,插入新的一行,并将以下命令复制粘贴进去:

* * * * * sleep 5; /root/tcp_collect.sh
* * * * * sleep 35; /root/tcp_collect.sh

如果需要按分钟来执行,只需要这么写就可以了:

# 每分钟执行一次
*/1 * * * * /root/tcp_collect.sh

# 每 3 分钟执行一次
*/3 * * * * /root/tcp_collect.sh

# 每 30 分钟执行一次
*/30 * * * * /root/tcp_collect.sh

按一次 ESC 键退出编辑模式,然后键入 “ :wq ” 保存并退出。

因为 crontab 的最小时间单位是分钟,所以采用 sleep 的方式来实现秒级的运行。即同时创建两个自动任务:

  • 第一个任务每分钟执行一次,是先休眠 5 秒钟后再执行 tcp_collect.sh ;
  • 另一个任务也是每分钟执行一次,是先休眠 35 秒钟后再执行 tcp_collect.sh 。

这样就相当于只有一个任务,且每 30 秒钟执行一次。

至此,部署完成。

分析:

通过使用 grep 命令来搜索我们可以看到,80 端口( Nginx )和 8088 端口( node.js )的 TCP 连接数大约有 3485 个:

[root@host tcp_connection]# cat tcp_2018-06-30-10-42-03.txt | grep ":80" | wc -l
3485
[root@host tcp_connection]#

注意,在匹配 “:80” 时,:80 和 :8088 都是可以匹配上的。

在 80 端口( Nginx )和 8088 端口( node.js )的 TCP 连接数中,处在 ESTABLISHED 状态的 TCP 连接也有大约 3480 个:

[root@host tcp_connection]# cat tcp_2018-06-30-10-42-03.txt | grep ":80" | grep ES | wc -l
3480
[root@host tcp_connection]#

总而言之,我们可以通过查看这个日志文件来分析一下到底建立了哪些 TCP 连接,从而找到问题的原因。

打赏作者
这里是 “ CCIE 工程师社区 ” 官方的捐款通道,您是否可以考虑请我们喝杯咖啡呢?

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

Was this article helpful?

Related Articles

Leave A Comment?

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据