You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何每日定时执行Shell脚本中的指定函数追加增量日志

实现方案

整体分两步完成:先完善Shell脚本的写入逻辑、做好重复执行防护,再通过系统自带的crontab配置每日定时触发增量采集任务。

1. 完善Shell脚本逻辑

核心要区分两个函数的写入模式:funcA全量拉取用覆盖写入,funcB增量采集用追加写入,同时增加采集标记避免重复写入同时间段日志。
你可以直接参考下面的脚本框架,替换成自己实际的日志拉取逻辑即可,示例脚本保存为login_log_collect.sh:

#!/bin/bash
# 全量日志存储路径,对应你提到的file1,可按需修改
LOG_FILE="/data/logs/server_login_full.log"
# 采集标记文件,记录上次采集的时间戳,避免日志重复采集
MARK_FILE="/data/logs/.login_log_collect.mark"

funcA() {
    echo "开始拉取全量服务器登录日志..."
    # === 替换为你实际的全量拉取逻辑,注意用 > 覆盖写入日志文件 ===
    # 示例:遍历服务器列表拉取所有登录、登录失败日志
    # for host in $(cat /data/conf/server_list.txt); do
    #     ssh -o ConnectTimeout=3 $host "last -F; lastb -F"
    # done > "$LOG_FILE"
    # === 全量逻辑替换结束 ===

    # 写入初始采集标记,记录全量拉取完成的时间戳
    date +%s > "$MARK_FILE"
    echo "全量日志拉取完成,已写入${LOG_FILE}"
}

funcB() {
    # 未做全量初始化时自动先跑全量
    if [ ! -f "$LOG_FILE" ] || [ ! -f "$MARK_FILE" ]; then
        echo "未检测到全量日志/采集标记,自动执行全量初始化"
        funcA
        exit 0
    fi

    last_collect_ts=$(cat "$MARK_FILE")
    current_ts=$(date +%s)
    echo "开始采集${last_collect_ts}至${current_ts}的增量登录日志..."
    # === 替换为你实际的每日增量拉取逻辑,注意用 >> 追加写入日志文件 ===
    # 示例:只拉取上次采集时间之后的日志
    # for host in $(cat /data/conf/server_list.txt); do
    #     ssh -o ConnectTimeout=3 $host "last -F -s @${last_collect_ts} -t @${current_ts}; lastb -F -s @${last_collect_ts} -t @${current_ts}"
    # done >> "$LOG_FILE"
    # === 增量逻辑替换结束 ===

    # 更新采集标记为本次采集时间
    echo "$current_ts" > "$MARK_FILE"
    echo "增量日志采集完成,已追加写入${LOG_FILE}"
}

# 脚本入口,支持传参指定执行模式
case "$1" in
    full)
        funcA
        ;;
    incremental)
        funcB
        ;;
    *)
        echo "用法: $0 {full|incremental}"
        exit 1
        ;;
esac

脚本写完后注意以下事项:

  • 把脚本中注释标注的示例命令替换为你实际的业务逻辑,绝对不要写错重定向符号:全量写入用>覆盖文件,增量写入必须用>>追加,否则会清空file1里已存的历史日志。
  • 标记文件的作用是锚定上次采集的时间点,避免定时任务重跑、手动误执行时重复写入同一段日志,保证日志不重复、不遗漏。
  • 给脚本加可执行权限,先手动跑一次全量初始化:chmod +x /path/to/login_log_collect.sh && /path/to/login_log_collect.sh full,确认file1里的全量日志写入正常。

2. 配置crontab每日定时执行增量任务

直接用Linux系统自带的crontab实现定时调度即可,不需要额外安装服务:

  • 执行crontab -e编辑定时任务,如果采集日志需要root权限,就执行sudo crontab -e编辑root用户的任务。
  • 在文件末尾添加一行定时规则,比如配置为每天凌晨1点05分执行增量采集(低峰期执行不影响业务):
5 1 * * * /path/to/login_log_collect.sh incremental >> /var/log/login_log_collect_cron.log 2>&1

规则说明:

  • 开头的5 1 * * *是cron时间表达式,对应“每天凌晨1点05分”,如果要调整执行时间直接修改这部分即可,比如要每天凌晨2点整执行就写0 2 * * *。
  • 脚本路径必须写绝对路径,不要写相对路径,否则cron执行时会因为工作目录不对找不到脚本。
  • 末尾的>> /var/log/login_log_collect_cron.log 2>&1是把定时任务的执行输出、报错都写到单独的日志文件,方便后续排查问题。
  • 保存退出后crontab会自动加载新规则,不需要手动重启服务。

验证方法

  • 手动执行一次/path/to/login_log_collect.sh incremental,检查file1末尾是否正常追加了最新的日志,标记文件的时间戳是否更新为当前时间。
  • 定时任务到点执行后,检查cron运行日志有没有报错,确认file1里新增了对应时间段的登录日志即可。

内容的提问来源于stack exchange,提问作者Ham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:06:24