Inotify

inotify 介绍

inotify-tools 是一个用C语言库,一个为Linux提供简单inotify接口的命令行程序。这些程序可以用于监视文件系统事件并执行相应操作,这些程序是用C语言来写的,除了需要Linux内核的inotify支持外,没有其他的依赖,使用方便。

inotify 在Linux内核 2.6.13 (June 18, 2005)版本中引入的一个新功能,它为用户态监视文件系统的变化提供了强大的支持,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。

安装

sudo apt -y install inotify-tools

滚动日志

cat /etc/logrotate.d/watch_daily
/var/log/watch_daily_latest.log {
  rotate 1
  monthly
  compress
  missingok
  notifempty
}

检测文件改动并创建latest链接

监控脚本放入/etc/init.d/目录,开机启动.

#!/bin/bash -xe
logfile=/var/log/watch_daily_latest.log
exec > $logfile 2>&1
destDir="/nfs/iso/daily"
update_latest() {
    notifyFile=$1
    notifyDir=$(dirname "$notifyFile")
    notifyDirUp=$(dirname "$notifyDir")
    if [ "$notifyDirUp" == "$destDir" ]; then
          pushd "$notifyDir" > /dev/null
            #文件夹是8位数字的参与排序
            latestDir=$(find . -mindepth 1 -type d -mtime -7 -regextype "posix-egrep" -regex "^\./[0-9]{8}$" -printf "%T@ %p\n" | sort -nr | head -1 | cut -d ' ' -f 2 | awk -F '/' '{print $2}')
            ln -sfn "$latestDir" latest
          popd > /dev/null
    fi
}
#inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format  '%T %w%f %e' --event delete,modify,create,attrib  ${destDir} | while read  date time file event
inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format  '%T %w%f %e' --event delete,create ${destDir} | while read -r date time file event; do
      case $event in
          MODIFY | CREATE | MOVE | MODIFY,ISDIR | CREATE,ISDIR)
            filename=$(basename "$file")
            regexResult1=$(python3 -c "import re; print(re.match('\.(\w)*', '$filename',re.S))")
            regexResult2=$(python3 -c "import re; print(re.match('Cu(\w)*', '$filename',re.S))")
            regexResult3=$(python3 -c "import re; print(re.match('[0-9]{8}', '$filename',re.S))")
            if [[ 'None' != "${regexResult1}" ]] || [[ 'None' != "${regexResult2}" ]] || [[ 'None' == "${regexResult3}" ]]; then
                echo "hidden files or Not date-dir, pass"
            else
                echo "$event"'-'"$file"'-'"$date"'-'"$time"
                    if [ 'latest' == "$(basename "$file")" ]; then
                         echo "latest self, pass"
                else
                          update_latest "$file"
                fi
            fi
              ;;

          MOVED_FROM | MOVED_FROM,ISDIR | DELETE | DELETE,ISDIR)
                  echo "$event"'-'"$file"'-'"$date"'-'"$time"
                  update_latest "$file"
              ;;
    esac
done

文档信息