如何每日定时执行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
相关产品推荐
相关产品推荐

