使用cron来定时执行脚本的步骤

Posted on 2023-08-02 16:11  brad1208  阅读(261)  评论(0编辑  收藏  举报

创建一个脚本,比如:/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