CentOS下cron执行bash脚本时如何在日志标记rsync执行序号
为定时脚本中的rsync调用添加顺序执行标记
实现思路
完全兼容现有cron调度逻辑和原有日志收集规则,不需要调整cron配置,也不会丢失原有的rsync输出内容。核心逻辑是在每一次rsync执行前向日志文件写入对应次序的标识,所有输出统一追加到目标日志路径,保证标识和对应rsync的输出顺序完全对齐。
基础修改方案
如果脚本中rsync调用次数不多,可以直接按以下步骤改造:
- 脚本开头初始化计数器和统一日志路径变量,避免重复硬编码:
#!/bin/bash # 日志路径保持和原有配置一致即可 LOG_FILE="/var/log/cron/your_cron_job.log" # 初始化rsync执行计数器 RSYNC_SEQ=1
- 对每一处原有rsync命令,在前面添加序号标记输出:
# 第一次rsync调用 echo "rsync${RSYNC_SEQ}" >> "$LOG_FILE" rsync 这里替换成你原来的rsync全量命令和参数 >> "$LOG_FILE" 2>&1 # 计数器自增 ((RSYNC_SEQ++)) # 第二次rsync调用 echo "rsync${RSYNC_SEQ}" >> "$LOG_FILE" rsync 这里替换成你第二组rsync全量命令和参数 >> "$LOG_FILE" 2>&1 ((RSYNC_SEQ++)) # 后续所有rsync命令都按照上面的格式依次追加即可
改完后的日志会严格按照要求输出:先打印rsync1标识,接着输出第一次rsync的全部执行结果,再打印rsync2,接着输出第二次rsync结果,以此类推。
优化方案(适合rsync调用次数较多的场景)
如果脚本里rsync调用超过3次,重复写标记和计数器逻辑会比较冗余,可以封装成通用函数简化代码:
#!/bin/bash LOG_FILE="/var/log/cron/your_cron_job.log" RSYNC_SEQ=1 # 封装rsync执行函数,自动打印序号、透传参数、记录日志 rsync_with_log() { echo "rsync${RSYNC_SEQ}" >> "$LOG_FILE" rsync "$@" >> "$LOG_FILE" 2>&1 local ret=$? ((RSYNC_SEQ++)) return $ret } # 后续调用直接用封装好的函数即可,自动按顺序计数 rsync_with_log -avz /data/path1/ user@remote:/backup/path1/ rsync_with_log -avz /data/path2/ user@remote:/backup/path2/ rsync_with_log -avz /data/path3/ user@remote:/backup/path3/
注意事项
- 确认cron任务的执行用户对
/var/log/cron目录有写入权限,避免日志写入失败 - 所有日志写入必须用追加模式
>>,不能用覆盖模式>,否则会清空之前的日志内容 - 如果原有配置已经把脚本的全量输出重定向到日志文件,不需要给每个rsync单独加重定向,只需要在每个rsync前加
echo "rsync${RSYNC_SEQ}"再自增计数器即可,适配你原来的日志收集逻辑
内容的提问来源于stack exchange,提问作者Andrzej Kaminski
相关产品推荐
相关产品推荐

