创建一个脚本,比如:/opt/port_stats.sh,脚本内容:
#!/bin/bash
# 设置要监控的端口列表
ports=({80,8080,456})
# 执行一次循环
for port in "${ports[@]}"; do
num=$(netstat -nat | grep ":"$port | wc -l)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $port $num" >> /opt/output.log
done
打开终端或命令行界面。
输入以下命令来编辑 crontab 文件:
crontab -e
在 crontab 文件中添加以下一行,以使脚本每隔一分钟自动执行一次:
* * * * * /bin/bash /opt/port_stats.sh
保存文件并退出文本编辑器。
确保脚本 port_stats.sh 具有可执行权限:
chmod +x /opt/port_stats.sh
重启 cron 服务以使更改生效(在某些系统中可以使用 cronie/crond 替代 cron):
sudo systemctl restart cron
sudo systemctl restart crond
这些步骤会将你的脚本配置为每隔一分钟自动执行一次,并将结果写入 /opt/output.log 文件中。
【设置开机执行该任务】
创建一个新的服务单元文件,比如 port_stats.service,并将以下内容粘贴进去:
[Unit]
Description=Run port_stats.sh every minute at startup
[Service]
Type=simple
ExecStart=/bin/bash /opt/port_stats.sh
[Install]
WantedBy=default.target
这会在系统开机时执行你的脚本 /opt/port_stats.sh。
将这个文件保存到 /etc/systemd/system/ 目录中。
运行以下命令启用并启动这个服务:
sudo systemctl enable port_stats.service
sudo systemctl start port_stats.service
这将启用服务并在系统开机时自动执行定时任务。
【日志拆分】
可以使用 logrotate 工具来自动拆分日志文件,以防止日志文件过大。logrotate 是一个用于管理日志文件的系统工具,它可以按照一定的条件和规则自动进行日志文件的轮转和拆分。
以下是如何设置 logrotate 来处理你的 output.log 文件:
创建一个新的配置文件,比如 port_stats_logrotate.conf,并将以下内容粘贴进去:
/opt/output.log {
size 10M #当日志文件达到 10 兆大小时触发拆分
rotate 10 #最多保留 10 个旧的日志文件
compress #压缩旧的日志文件
missingok #如果日志文件不存在,则忽略错误
notifempty #如果日志文件为空,则忽略错误
create 644 root root #创建新的日志文件时使用指定的权限和所有者
}
/opt/output.log {
size 10M #当日志文件达到 10 兆大小时触发拆分
rotate 10 #最多保留 10 个旧的日志文件
compress
missingok #如果日志文件不存在,则忽略错误
notifempty #如果日志文件为空,则忽略错误
create 644 root root #创建新的日志文件时使用指定的权限和所有者
olddir /opt/archive
postrotate
mv /opt/output.log.1 /opt/output.log.1.log
endscript
}
这个配置文件指定了以下内容:
size 10M:当日志文件达到 10 兆大小时触发拆分。
rotate 10:最多保留 10 个旧的日志文件。
compress:压缩旧的日志文件。
missingok:如果日志文件不存在,则忽略错误。
notifempty:如果日志文件为空,则忽略错误。
create 644 root root:创建新的日志文件时使用指定的权限和所有者。
将这个配置文件保存到 /etc/logrotate.d/ 目录中。
运行以下命令来手动执行一次 logrotate:
sudo logrotate -f /etc/logrotate.d/port_stats_logrotate.conf
这将立即执行一次日志轮转,并拆分 output.log 文件。
之后,每当 output.log 文件达到 10 兆大小时,logrotate 将自动执行日志轮转,拆分日志文件并保留指定数量的旧日志文件。
将数据储存到指定的数据库中:
#!/bin/bash
# 将MySQL客户端路径添加到脚本的PATH中
export PATH="/usr/local/mysql/bin:$PATH"
# 设置要监控的端口列表
ports=(80 8080 456)
# 定义数据库连接参数
db_host="192.168.1.182"
db_user="root"
# 建议将密码存储在安全的文件中,而不是明文写在脚本中
db_name="YC_ceshi"
table_name="demo_1"
# 定义日志文件路径
log_file="/var/log/port_stats.log"
# 创建日志文件(如果不存在)
touch "$log_file"
# 获取当前日期和时间
current_datetime=$(date +"%Y-%m-%d %H:%M:%S")
# 执行一次循环
for port in "${ports[@]}"; do
# 使用ss命令获取连接数,避免使用netstat
num=$(ss -tuna | grep -E ":$port\s+" | wc -l)
# 构建插入数据的查询语句
query="INSERT INTO $table_name (port, num_connections, datetime) VALUES ('$port', $num, '$current_datetime')"
# 连接到数据库并执行查询,使用密码文件来提供密码
#mysql --host="$db_host" --user="$db_user" --password="$(cat /opt/password_file)" "$db_name" -e "$query"
mysql --host="$db_host" --user="$db_user" "$db_name" -e "$query"
# 检查mysql命令的退出状态
if [ $? -eq 0 ]; then
echo "$current_datetime: Successfully inserted data for port $port" >> "$log_file"
else
echo "$current_datetime: Failed to insert data for port $port" >> "$log_file"
fi
done
秘钥储存在:~/.my.cnf