热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux/MAC监控目录和文件修改变化的利器—fswatch

【fswatch的介绍】fswatch一个跨平台文件变化监测器,当指定的文件或目录的内容被修改时接收通知。fswatch是一个工具,通过检测文件的变化,并触发指定的

fswatch 的介绍

fswatch 一个跨平台文件变化监测器,当指定的文件或目录的内容被修改时接收通知。fswatch是一个工具, 通过检测文件的变化,并触发指定的命令。总之,fswatch是一个跨平台的文件更改监视,获取通知警报在指定的文件或目录的内容被改变或修改。

它在不同的操作系统上执行四种类型的监视器,例如:

  1. 基于Apple OS X的文件系统事件API的监视器构建。
  2. 基于kqueue的显示器,目前在FreeBSD的4.1通知接口还支持许多* BSD系统,OS X的包容性。
  3. 基于Solaris内核的文件事件通知API的监视器及其附加功能。
  4. 基于inotify的监视器,一个显示文件系统对应用程序修改的内核子系统。
  5. 基于ReadDirectoryChangesW的监视器,它是记录更改为目录的Windows API。
  6. 定期检查文件系统状态,在内存中保存文件修改时间,以及手动确定文件系统更改(可在任何地方使用stat)的监视器。

fswatch的特点

  1. 支持几种特定于OS的API
  2. 允许递归目录监视
  3. 使用包含和排除正则表达式执行路径过滤
  4. 支持自定义记录格式
  5. 此外,它支持周期性空闲事件

fswatch地址:https://github.com/emcrisostomo/fswatch(原版) https://github.com/codeskyblue/fswatch(改过)

使用场景:

当服务器文件夹的文件内容有改动的时候通知管理员或者执行某些操作,如easyswoole框架,启动的时候是先加载到内存的,有文件更新了,需要重启服务器才能生效,每次更改文件都重启web服务,开发效率会大大降低,所以需要监控文件夹的改动,如果有文件发生变化,自动停止服务器,然后启动服务器,不需要每次更新代码都手动重启。 

同类工具对比:

目前拿这个fswatch替代bee, 实时的去编译运行c,cpp,java,golang等等, 应该都不是问题. 但是和bee比有什么优势呢?

既然大神问了,我就列举下:

  1. bee只适合Go语言; 而fswatch可以适用各种语言, 甚至是文件的远程同步
  2. bee可以通过配置指定监控的文件夹; fswatch可以配置监控的文件夹并指定监控的深度(0代表当前目录)
  3. bee可以指定监控文件的后缀; fswatch支持使用正则表达式, 来过滤监控到的文件.
  4. bee.json需要重其他地方拷贝;但是fswatch.json可以自动生成出来.
  5. fswatch支持group-kill. 这样可以确保fswatch停止后,不会有垃圾进程的存在.
  6. fswatch会根据程序的运行时间自动判断, 是否为服务端程序, 并适当的修改重启策略.
  7. bee功能庞大; fswatch的代码精简.

fswatch的安装

重要提示 :请确保您已经GNU GCC(C和C ++编译器)和开发工具( 编译必须Debian / Ubuntu的 )安装在系统上,你从源代码编译fswatch之前。 如果没有,请使用以下命令在相应的Linux发行版上安装它。

# yum group install 'Development Tools' [On CentOS/RHEL]
# dnf group install 'Development Tools' [On Fedora 22+ Versions]
$ sudo apt-get install build-essential [On Debian/Ubuntu Versions]

wget https://github.com/emcrisostomo/fswatch/releases/download/1.11.2/fswatch-1.11.2.tar.gz
tar -xvzf fswatch-1.11.2.tar.gz
cd fswatch-1.11.2
sudo ./configure
sudo make
sudo make install sudo ldconfig

fswatch的使用

运行fswatch的一般语法是:

$ fswatch [option] [path]

Linux上,我们建议您使用默认的inotify的显示器,你可以列出采用现有的显示器-M- list-monitors选项:

$ fswatch -M
$ fswatch --list-monitors

 

fswatch - 列表监视器

下面的命令让您观看在当前目录(变动/home/howtoing ),与事件传递到每4秒标准输出。

-l或- -latency选项允许您设置在几秒钟的等待时间,默认是1秒。

$ fswatch -l 4 .

接下来的命令监控更改为每5/var/log/auth.log文件:

$ fswatch -l 5 /var/log/auth.log

使用-t--timestamp选项可以打印时间戳每个事件,要打印UTC格式的时间,使用-u--utf-time选项。 您可以使用以及格式化时间-f--format-time格式选项:

$ fswatch --timestamp /var/log/auth.log

接下来, -x--event-flags告诉fswatch打印的事件标志的旁边事件路径。 您可以使用-event-现场分隔符选项,打印使用特定的分离活动。

$ fswatch --events-flags ~ /var/log/auth.log

要打印显示在你的目录,/var/log/auth.log文件更改事件的数值,使用-n--numeric选项如下:

$ fswatch --numeric ~ /var/log/auth.log

也许你可以通过看详细用法选项和信息fswatch手册页:

$ man fswatch

欲了解更多信息和用法,请访问fswatch Github上库: https://github.com/emcrisostomo/fswatch

脚本案例

vim fswatch.sh
chmod 755 fswatch.sh 赋予脚本执行权限,copy内容到 fswatch.sh#!/bin/bash
DIR=$1if [ ! -n "$DIR" ] ;thenecho "you have not choice Application directory !"exit
fiphp easyswoole stop
php easyswoole start --dfswatch $DIR | while read file
doecho "${file} was modify" >> ./Temp/reload.log 2>&1php easyswoole reload
done运行脚本监听/easyswoole/App文件夹的改动./fswatch.sh /easyswoole/App

 

【企业应用—使用inotify/fswatch构建自动监控脚本】


自动告警脚本

最近项目上有这样一个需求:系统中有一个后台服务会不断的生成监控日志,根据系统的运行情况,它每天会在目录/var/alarms下生成一个文件,文件名带有时间戳,其中内容格式如下:

 

1

$ cat /var/alarms/alarms-20150228130522.csv
node,summary,occurrence,proiority
VIQ002,heartbeat failure,2/12/2015 01:23 AM,critical
VIQ002,packages are rejected,2/12/2015 01:22 AM,major
VIQ002,connection cannot be established,2/11/2015 01:23 AM,medium
VIQ001,packages are rejected,2/11/2015 01:23 AM,warning
VIQ001,connection cannot be established,2/09/2015 01:23 AM,medium
...

运维团队需要监控这个目录,如果里边的文件发生了变化,就要及时的发送邮件给工程团队解决。我们当然不可能人工的监控该目录,然后编写邮件,再拷贝粘贴,所以需要编写一个脚本来自动化这个任务。

处理方法有两种:

  1. 编写一个crontab的任务,每隔五分钟轮询一下,然后编写脚本来探测变化,发送邮件
  2. 使用操作系统提供的inotify相关API探测变化,编写脚本发送邮件

不过作为程序员,第二种方法显然更高级一些。另外相对于检测文件变化(对比目录树,检查时间戳,而且还要记录上一次变更的状态等),编写一个发送邮件的脚本要简单得多。

使用inotify

如果在Linux下,我们可以使用inotify相关的工具,你可以使用你正在使用的系统下的包管理工具来安装。也可以直接从源码包编译安装。

安装之后,系统中就有了一个叫做inotifywait的命令,这个命令提供多个参数。默认的inotifywait在接收到指定的事件(文件变化)后,会打印信息并退出。可以使用-m参数让inotifywati处于监听状态。-e参数指定需要监听的事件类型,下面是几个常见的事件类型:

  1. CREATE,创建
  2. MODIFY,修改
  3. CLOSE_WRITE,CLOSE,写入成功

还可以通过--format来指定事件的输出,%w表示监控的文件名,%f表示如果被监控的对象是目录,则当发生事件时返回文件名。比如下面的命令:

 

1

$ inotifywait -m -e close_write /var/alarms --format "%w%f"

表示以监控模式(事件发生后不退出,继续监听),监听close_write事件,在/var/alarms目录上,并且输出的格式为%w%f

这样我们在另一个窗口上模拟事件发生:

 

1

$ touch /var/alarms/alarms-20150228130522.csv

当前的窗口就会出现/var/alarms/alarms-20150228130522.csv这样的输出。有了这个功能,我们只需要编写一段简单的脚本就可以完成上一小节中的问题了:

 

1

#!/bin/bash
DIR=$1inotifywait -m -e close_write $DIR --format "%w%f" | while read FILE
docat ${FILE} | mail -s "Alarm: $FILE" juntao.qiu@gmail.com
done

命令mail是Linux下默认的邮件客户端,可以完成邮件的发送功能。将上边的脚本命名为monitor.sh,添加可执行权限,并启动监控:

 

1
2

$ chmod +x monitor.sh
$ ./monitor.sh /var/alarms

这样,当目标目录/var/alarms发生变化后,我们就可以收到告警邮件了!

Mac OSX下使用fswatch

如果是在Mac OSX下,虽然没有了inotify相关的API,但是我们可以使用fswatch来完成同样的工作。

使用brew安装fswatch:

 

1

$ brew install fswatch

即可。fswatch也有很多选项,我们这里仅使用-0(表示以传统的NUL作为字符串终结符,因为*nix下文件名可以包含任意字符,比如空格)。我们可以很容易的用xargs将检测到的事件进行进一步的处理:

 

1

fswatch -0 /var/alarms | xargs -0 -n 1 ~/bin/send-notify.sh

其中,-0的意思与fswatch的命令中的-0一致,-n 1表示每条NUL结尾的字符串都执行一次脚本。脚本send-notify.sh的内容如下:

 

1

#!/bin/bashFILE=$1
cat $FILE | mail -s "Alarm: $FILE" baiducloud@gmail.com

这样,当文件发生变化时,脚本就会发送一封邮件到指定邮箱了(由于我自己的laptop的hostname不像是一个合理的主机名,所以Gmail会把这封邮件放到垃圾邮件列表中,这里只是用作示例而已)。

 

当然,由于脚本是我们自己可以编写的,所以理论上当检测到变化之后,我们可以做任何事情,比如说几句话,播放一段音乐等。


推荐阅读
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
author-avatar
小闯娃
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有