目录文件变化监控和实时文件同步-SHELL脚本

        在日常的服务器管理或者数据处理工作中,我们常常需要对特定目录的变化进行监控并做出相应的操作。今天就来和大家分享一个简单的 bash 脚本实现的功能。

        我们首先使用inotifywait工具来监控一个目录,在这个脚本里,我们监控的是/opt目录(通过MON_DIR=/opt定义)。inotifywait以持续(-m)、安静(-q)和递归(-r)的模式运行,并且只关注文件创建(-e create)事件,输出格式设置为只显示文件名(--format %f)。

        当检测到文件创建事件时,脚本会执行一个循环。在循环中,有一个重要的操作是使用rsync工具。rsync -avz /opt /tmp/opt会将/opt目录下的所有内容(包括新创建的文件)以归档、详细输出和压缩的方式同步到/tmp/opt目录,这样可以确保/tmp/opt目录的内容能及时更新。

        另外,原本脚本还有一个计划中的功能,就是当文件创建时,通过邮件通知相关人员。虽然当前脚本中这部分(echo "$(date +'%F %T') create $files" | mail -s "dir monitor" [url=mailto:[email protected]][email protected][/url])是注释掉的,但如果配置好邮件客户端相关设置,就可以实现这个功能,让管理员能及时了解目录的变化情况。这个脚本虽然简单,但在自动化目录管理方面能发挥很大的作用哦。

#!/bin/bash
MON_DIR=/opt
inotifywait -mqr --format %f -e create $MON_DIR |\
while read files; do
   rsync -avz /opt /tmp/opt
   #echo "$(date +'%F %T') create $files" | mail -s "dir monitor" [url=mailto:[email protected]][email protected][/url]
done
  1. 脚本头部
    #!/bin/bash 这是一个 bash 脚本的标识,指定了该脚本使用 bash 来解释执行。
  2. 定义监控目录变量
    MON_DIR=/opt 定义了一个变量MON_DIR,其值为/opt,这是要进行监控的目录路径。
  3. 使用 inotifywait 进行监控
    inotifywait -mqr --format %f -e create $MON_DIR
    • -m参数表示以持续监控模式运行,而不是只执行一次。
    • -q表示减少输出的冗余信息,以更安静的模式运行。
    • -r表示递归监控目录(如果/opt有子目录,也会监控子目录中的事件)。
    • --format %f指定了输出的格式,这里只输出触发事件的文件名。
    • -e create表示只关注文件创建事件。$MON_DIR是之前定义的要监控的目录。
  4. 循环处理监控事件
    while read files; do... done
    • inotifywait检测到文件创建事件并输出文件名后,read命令会读取这个文件名到变量files中。
    • 在循环体中:
      • rsync -avz /opt /tmp/opt:这行命令使用rsync工具以归档(-a)、详细输出(-v)和压缩(-z)的模式将/opt目录同步到/tmp/opt目录。这样可以在有新文件创建时保持/tmp/opt/opt的一致性(不过这里存在一个问题,如果/tmp/opt已经存在,rsync的行为可能不符合预期,可能需要先确保/tmp/opt不存在或者使用合适的rsync参数来处理这种情况)。
      • 注释部分#echo "$(date +'%F %T') create $files" | mail -s "dir monitor" [url=mailto:[email protected]][email protected][/url]:这原本是计划在检测到文件创建时,将创建的时间和文件名信息通过邮件发送给指定邮箱([email protected]),不过这里邮件相关的部分需要根据实际环境配置邮件客户端等相关设置才能正常工作,并且 URL 格式在脚本中是错误的,应该只是[email protected]

你可能感兴趣的:(linux,运维,服务器)