热门标签 | 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会把这封邮件放到垃圾邮件列表中,这里只是用作示例而已)。

 

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


推荐阅读
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Linux系统中默认安装目录有哪些?Tomcat在Linux下的默认安装路径是什么?
    在Linux系统中,默认安装目录通常包括 `/usr`, `/opt`, 和 `/var` 等。对于Tomcat而言,在Linux下的默认安装路径通常是 `/opt/tomcat` 或者 `/usr/local/tomcat`。具体路径可能会因不同的发行版和配置而有所差异。例如,在Ubuntu Server中,Tomcat的默认安装路径通常是 `/opt/tomcat`。这些目录的选择旨在确保系统的整洁性和可维护性。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • FreeBSD环境下PHP GD库安装问题的详细解决方案
    在 FreeBSD 环境下,安装 PHP GD 库时可能会遇到一些常见的问题。本文详细介绍了从配置到编译的完整步骤,包括解决依赖关系、配置选项以及常见错误的处理方法。通过这些详细的指导,开发者可以顺利地在 FreeBSD 上完成 PHP GD 库的安装,确保其正常运行。此外,本文还提供了一些优化建议,帮助提高安装过程的效率和稳定性。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
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社区 版权所有