• 参数-f使tail不停地去读最新的内容,这样有实时监视的效果 tail -f /var/log/2019.log

    参数-f使tail不停地去读最新的内容,这样有实时监视的效果

    tail -f /var/log/2019.log

    展开全文
  • 本地提交文件到Git服务器,脚本监控仓库变化,获取最新更改信息,实时发送邮件给仓库所有者。

    linux监控文件或文件夹变化的shell脚本

    本地提交文件到Git服务器,脚本监控仓库变化,获取最新更改信息,实时发送邮件给仓库所有者。

    安装inotify-tools

    sudo apt-get install inotify-tools
    
    #!/bin/sh
    
    # 监视的文件或目录
    filename=$1
    
    # 监视发现有增、删、改时执行的脚本
    script=$2
    
    inotifywait -mrq --format '%e' --event create,delete,modify  $filename | while read event
      do
          case $event in MODIFY|CREATE|DELETE) bash $script ;;
          esac
      done
    

    这个脚本的功能是循环监听文件或目录的增删改事件,当事件发生执行设置的脚本文件。

    inotifywait选项:

    -h|--help     	
    			显示帮助信息
    @<file>       	
    			排除不需要监视的文件,可以指定相对路径或绝对路径
    --fromfile <file>
                 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
    -m|--monitor  	
    			收到单个事件不退出,一直监视,默认:收到单个事件后立即退出
    -d|--daemon   	
    			跟--monitor一样,除了是在后台运行,需要指定--outfile把事情输出到一个文件。也意味着使用了--syslog
    -o|--outfile <file>
                 输出事件到<file>而不是stdout
    -s|--syslog   	
    			输出错误信息到syslog而不是stderr
    -r|--recursive	
    			监控目录下所有子目录,创建新的子目录也会被监控
    -q|--quiet    	
    			不输出详细信息
    --exclude <pattern>
                 不处理正则表达式匹配到的文件的任何事件,大小写敏感
    --excludei <pattern>
                 不处理正则表达式匹配到的文件的任何事件,大小写敏感
     -t <seconds>, --timeout <seconds>
                 设置超时时间,如果为0,则一直等待事件
     -e <event>, --event <event>
                 指定监听的事件,可以多次指定,如果省略,则监听所有事件
     -c, --csv
     			输出为csv格式
     --timefmt <fmt>	
     			指定时间格式,用于--format选项中的%T格式
     --format <fmt>	指定输出格式
         %w 表示发生事件的目录
         %f 表示发生事件的文件
         %e 表示发生的事件
         %Xe 事件以“X”分隔
         %T 使用由--timefmt定义的时间格式
    

    inotifywait事件:

    access 读取文件或目录
    
    modify 写文件或目录
    
    attrib 更改文件或目录属性
    
    close_write 文件在写后关闭
    
    close_nowrite 文件在只读模式下被读后关闭
                 
    close  文件或目录被关闭
    
    open   文件或目录被打开
    
    moved_from  文件或者目录移出监视目录
    
    moved_from  文件或目录从监视目录移出
    
    move 文件或目录移动
    
    create 创建文件或目录
    
    delete 删除文件或目录
    
    delete_self 删除后不再监听此文件或目录
    
    unmount 文件系统取消挂载,此后不在监听该文件系统
    
    展开全文
  • Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。 需求: 1.有一个文件采集进程,需要对日志文件进行采集,日志...


    基本概念:

    Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。


    需求:

    1.有一个文件采集进程,需要对日志文件进行采集,日志文件可能会被删除,可能会被移动。

    2.我们都知道文件一旦被删除或者移动,那么进程使用原有打开的文件fd就无法继续读取文件数据。

    3.那么就需要监控文件的创建,移动,删除等状态,以便重新打开文件,所以需要使用Inotify来做这件事。


    源码inotfy.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/inotify.h>
    #include <unistd.h>
    
    #define EVENT_NUM 12
    char *event_str[EVENT_NUM] =
    {
    "IN_ACCESS",
    "IN_MODIFY",        //文件修改
    "IN_ATTRIB",
    "IN_CLOSE_WRITE",
    "IN_CLOSE_NOWRITE",
    "IN_OPEN",
    "IN_MOVED_FROM",    //文件移动from
    "IN_MOVED_TO",      //文件移动to
    "IN_CREATE",        //文件创建
    "IN_DELETE",        //文件删除
    "IN_DELETE_SELF",
    "IN_MOVE_SELF"
    };
    
    int main(int argc, char *argv[])
    {
        int fd;
        int wd;
        int len;
        int nread;
        char buf[BUFSIZ];
        struct inotify_event *event;
        int i;
    
        // 判断输入参数
        if (argc < 2) {
            fprintf(stderr, "%s path\n", argv[0]);
            return -1;
        }
    
        // 初始化
        fd = inotify_init();
        if (fd < 0) {
            fprintf(stderr, "inotify_init failed\n");
            return -1;
        }
    
        /* 增加监听事件
         * 监听所有事件:IN_ALL_EVENTS
         * 监听文件是否被创建,删除,移动:IN_CREATE|IN_DELETE|IN_MOVED_FROM|IN_MOVED_TO
         */
        wd = inotify_add_watch(fd, argv[1], IN_CREATE|IN_DELETE|IN_MOVED_FROM|IN_MOVED_TO);
        if(wd < 0) {
            fprintf(stderr, "inotify_add_watch %s failed\n", argv[1]);
            return -1;
        }
    
        buf[sizeof(buf) - 1] = 0;
        while( (len = read(fd, buf, sizeof(buf) - 1)) > 0 ) {
            nread = 0;
            while(len> 0) {
                event = (struct inotify_event *)&buf[nread];
                for(i=0; i<EVENT_NUM; i++) {
                    if((event->mask >> i) & 1) {
                        if(event->len > 0)
                            fprintf(stdout, "%s --- %s\n", event->name, event_str[i]);
                        else
                            fprintf(stdout, "%s --- %s\n", " ", event_str[i]);
                    }
                }
                nread = nread + sizeof(struct inotify_event) + event->len;
                len = len - sizeof(struct inotify_event) - event->len;
            }
        }
    
        return 0;
    }

    编译运行:

    gcc inotfy.c
    
    // 监控当前目录的文件变化
    ./a.out ./
    

    测试结果:



    小结:

    1.可以根据需要对代码进行调整测试

    2.参考:http://www.ibm.com/developerworks/cn/linux/l-inotify/

    3.参考:http://www.jb51.net/article/37420.htm


    End;

    展开全文
  • 1. inotify主要功能它是一个内核用于通知用户空间程序文件系统变化的机制。众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为...
        

    1. inotify主要功能

    它是一个内核用于通知用户空间程序文件系统变化的机制。

    众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如hotplug、udev和 inotify 就是这种需求催生的。Hotplug 是一种内核向用户态应用通报关于热插拔设备一些事件发生的机制,桌面系统能够利用它对设备进行有效的管理,udev动态地维护 /dev 下的设备文件,inotify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知,该机制是著名的桌面搜索引擎项目beagle 引入的,并在Gamin 等项目中被应用。
    缺点只能单独监控一个目录或文件,不能监控目录下的所有子目录,想要监控子目录必须得自己通过递归的方法将所有目录都添加到监控中去

    2.用户接口

    在用户态,inotify 通过三个系统调用和在返回的文件描述符上的文件I/ 操作来使用,使用inotify 的第一步是创建inotify 实例:

    640?wx_fmt=png


        每一个 inotify 实例对应一个独立的排序的队列。

        文件系统的变化事件被称做 watches 的一个对象管理,每一个 watch 是一个二元组(目标,事件掩码),目标可以是文件或目录,事件掩码表示应用希望关注的inotify 事件,每一个位对应一个inotify 事件。Watch对象通过 watch描述符引用,watches 通过文件或目录的路径名来添加。目录watches 将返回在该目录下的所有文件上面发生的事件。

        下面函数用于添加一个 watch:


     

    640?wx_fmt=png

        fd 是inotify_init() 返回的文件描述符,path是被监视的目标的路径名(即文件名或目录名),mask是事件掩码, 在头文件 linux/inotify.h中定义了每一位代表的事件。可以使用同样的方式来修改事件掩码,即改变希望被通知的inotify事件。Wd 是 watch 描述符。

        下面的函数用于删除一个 watch:

    640?wx_fmt=png


        fd 是 inotify_init() 返回的文件描述符,wd 是 inotify_add_watch() 返回的 watch 描述符。Ret 是函数的返回值。

     

        文件事件用一个 inotify_event 结构表示,它通过由 inotify_init() 返回的文件描述符使用通常文件读取函数 read 来获得

    640?wx_fmt=png


        结构中的 wd 为被监视目标的 watch 描述符,mask 为事件掩码,len 为 name字符串的长度,name 为被监视目标的路径名,该结构的 name 字段为一个桩,它只是为了用户方面引用文件名,文件名是变长的,它实际紧跟在该结构的后面,文件名将被 0 填充以使下一个事件结构能够 4 字节对齐。注意,len 也把填充字节数统计在内。

     

        通过 read 调用可以一次获得多个事件,只要提供的 buf 足够大。

    640?wx_fmt=png


        buf 是一个inotify_event 结构的数组指针,BUF_LEN指定要读取的总长度,buf大小至少要不小于BUF_LEN,该调用返回的事件数取决于BUF_LEN 以及事件中文件名的长度。Len为实际读去的字节数,即获得的事件的总长度。

        可以在函数inotify_init() 返回的文件描述符fd 上使用 select()或poll(), 也可以在 fd 上使用 ioctl 命令 FIONREAD来得到当前队列的长度。close(fd)将删除所有添加到 fd 中的 watch 并做必要的清理。

    640?wx_fmt=png


    3. 内核实现原理

     在内核中,每一个 inotify 实例对应一个inotify_device 结构:

    640?wx_fmt=png


        d_list 指向所有inotify_device 组成的列表的,i_list指向所有被监视 inode 组成的列表,count 是引用计数,dev 指向该 watch 所在的 inotify 实例对应的inotify_device 结构,inode指向该 watch 要监视的 inode,wd 是分配给该 watch 的描述符,mask 是该 watch 的事件掩码,表示它对哪些文件系统事件感兴趣。

        结构inotify_device 在用户态调用inotify_init()时创建,当关闭inotify_init()返回的文件描述符时将被释放。结构inotify_watch 在用户态调用inotify_add_watch()时创建,在用户态调用inotify_rm_watch()或 close(fd)时被释放。

        无论是目录还是文件,在内核中都对应一个inode 结构,inotify系统在 inode 结构中增加了两个字段:

    640?wx_fmt=png


        d_list 指向所有inotify_device 组成的列表的,i_list指向所有被监视 inode 组成的列表,count 是引用计数,dev 指向该 watch 所在的 inotify 实例对应的inotify_device 结构,inode指向该 watch 要监视的 inode,wd 是分配给该 watch 的描述符,mask 是该 watch 的事件掩码,表示它对哪些文件系统事件感兴趣。

        结构inotify_device 在用户态调用inotify_init()时创建,当关闭inotify_init()返回的文件描述符时将被释放。结构inotify_watch 在用户态调用inotify_add_watch()时创建,在用户态调用inotify_rm_watch()或 close(fd)时被释放。

        无论是目录还是文件,在内核中都对应一个inode 结构,inotify系统在 inode 结构中增加了两个字段:

    640?wx_fmt=png


       inotify_watches 是在被监视目标上的watch 列表,每当用户调用inotify_add_watch()时,内核就为添加的watch 创建一个inotify_watch 结构,并把它插入到被监视目标对应的inode 的inotify_watches 列表。inotify_sem用于同步对inotify_watches 列表的访问。当文件系统发生第一部分提到的事件之一时,相应的文件系统代码将显示调用fsnotify_*来把相应的事件报告给inotify 系统,其中*号就是相应的事件名,目前实现包括:

       fsnotify_move,文件从一个目录移动到另一个目录fsnotify_nameremove,文件从目录中删除fsnotify_inoderemove,自删除fsnotify_create,创建新文件fsnotify_mkdir,创建新目录fsnotify_access,文件被读fsnotify_modify,文件被写fsnotify_open,文件被打开fsnotify_close,文件被关闭fsnotify_xattr,文件的扩展属性被修改fsnotify_change,文件被修改或原数据被修改有一个例外情况,就是inotify_unmount_inodes,它会在文件系统被umount 时调用来通知umount 事件给inotify 系统。

        以上提到的通知函数最后都调用inotify_inode_queue_event(inotify_unmount_inodes直接调用inotify_dev_queue_event ),该函数首先判断对应的inode是否被监视,这通过查看inotify_watches 列表是否为空来实现,如果发现inode 没有被监视,什么也不做,立刻返回,反之,遍历inotify_watches 列表,看是否当前的文件操作事件被某个watch 监视,如果是,调用inotify_dev_queue_event,否则,返回。函数inotify_dev_queue_event首先判断该事件是否是上一个事件的重复,如果是就丢弃该事件并返回,否则,它判断是否inotify 实例即inotify_device 的事件队列是否溢出,如果溢出,产生一个溢出事件,否则产生一个当前的文件操作事件,这些事件通过kernel_event构建,kernel_event将创建一个inotify_kernel_event 结构,然后把该结构插入到对应的inotify_device 的events 事件列表,然后唤醒等待在inotify_device结构中的 wq 指向的等待队列。想监视文件系统事件的用户态进程在inotify实例(即inotify_init()返回的文件描述符)上调用 read 时但没有事件时就挂在等待队列wq 上。

     

    640?wx_fmt=jpeg


    展开全文
  • Linux文件监控

    2009-07-21 22:02:00
    文件监控一直是Linux的一个弱项,windows有很好的消息机制,实现起来很方便。之前的Linux如果不想用轮询的方法,那只能用dnotify,但是性能和可操作性都很差。好在2.6.13以后的内核支持了dnotify的替代者——inotify...

    之前实现了逻辑任务调度功能,并把整个管理框架搭好,现在开始研究实现文件监控功能。

    文件监控一直是Linux的一个弱项,windows有很好的消息机制,实现起来很方便。

    之前的Linux如果不想用轮询的方法,那只能用dnotify,但是性能和可操作性都很差。好在2.6.13以后的内核支持了dnotify的替代者——inotify,基于它来实现linux文件监控变得容易了许多,更重要的是性能上的提高。

     

    inotify有一套对C的API,方便C程序开发使用。

    网上也有封装好的工具,inotify-tools就是经典代表。它就是直接用C封装的一套命令行工具箱,方便shell以及脚本使用。

    使用方法很简单,参考官方网站:http://inotify-tools.sourceforge.net/

     

    其中最有用的要数inotifywait命令,这里有详细用法:http://linux.die.net/man/1/inotifywait

     

    接下来要研究怎么较好的把该功能整合到之前的架构中。。。

    展开全文
  • tail命令可以输出文件的尾部内容,默认情况下它显示文件的最后十行。它常用来动态监视文件的尾部内容的增长情况,比如用来监视日志文件的变化。与tail命令对应的是head命令,用来显示文件头部内容。   常用参数 ...
  • linux监控平台搭建

    2018-07-01 22:47:49
    Linux监控平台介绍 监控的重要性不言而喻,一个企业就算架构再不成熟,监控都是必须要有的。监控不管用什么方式实现,开源软件也好,商业的监控服务也好,抑或是简陋的shell脚本,在业务上线时都首先要做到位。 ...
  • linux 监控平台介绍

    2018-07-26 19:58:08
    linux 监控平台介绍 常见的开源监控软件   cacti、nagios、zabbix、smokeping、open-falcon等等。  cacti、smokeping偏向于基础监控,成图漂亮。  cacti、nagios、zabbix服务端监控中心,需要php环境支持,...
  • 1、tail date.log 输出文件末尾的内容,默认10行 tail -20 date.log 输出最后20行的内容 tail -n -20 date.log 输出倒数第20行到文件末尾的内容 tail -n +20 date.log 输出第20行到文件末尾的内容 tail -f ...
  • 在服务器运维过程中,经常需要对服务器的各种资源进行监控,例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以下是Linux监控系统磁盘使用比例,当使用率达到指定比例,删除指定目录下的所有文件shell脚本...
  • GitHub Linux下网络监控工具总结 AderXCoding/system/tools/network_monitor本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处 对任何规模的业务来说, 网络监控工具都...
  • inotify是用来监视文件系统事件的机制,在linux 2.6.13内核中引入。该机制可以用来监视文件和目录,当文件或目录发生变化时,内核会将文件或目录的变化发送给inotify文件描述符,在应用层只需调用read()就可以读取...
  • 1.Linux监控概述 Linux服务器要保证系统的高可用性,需要实时了解到服务器的硬件、操作系统、应用服务等的运行状况,各项性能指标是否正常,需要使用各种LINUX命令。做到自动化运维就需要,将上述各项监控指标在同...
  • 1.Linux监控平台介绍  一个成熟的企业必须要有监控平台,流行的开源监控软件有:Cacti、Nagios、Zabbix、smokeping、open-falcon等。  前三款软件都可以监控服务器的基础指标,比如CPU、内存、磁盘、网络等,...
  • 零、Linux系统监控命令速查手册命令功能应用用法举例 free查看内存使用情况,包括物理内存和虚拟内存free -h或free -m vmstat对系统的整体情况进行统计,包括内核进程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息...
  • 一、影响Linux服务器性能的因素1.操作系统CPU,内存,磁盘,带宽2.程序本身 二、统性能评估标准影响性能因素影响性能因素评判标准好坏糟糕CPUuser% + sys%&lt; 70%user% + sys%= 85%user% + sys% &gt;=90%...
  • Linux中通过inotify-tools实现监控文件变化 本文转自:...
  • 背景说明: 一、htop是TOP的增强版;...Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoin...
  • 最近遇到了一个问题就是如何去查看一个目录下是否新增加了一个文件,千方百计终于搞到了很好的武功大法------inotify inotify是用来监视文件系统事件的机制,在Linux 2.6.13内核中引入。该机制可以用来监视文件和...
1 2 3 4 5 ... 20
收藏数 78,743
精华内容 31,497