如何使用 Incron 监控重要的文件和文件夹

前面我已经写了 Git 的 Webhooks 使用文章,但如果我们使用 Dropbox 或者谷歌云盘进行文件同步,文件发生变动时怎么自动执行脚本呢?
可以选择使用 Incron 进行文件监控。

什么是 Incron

先放几个官方的说明:

This program is an “inotify cron” system. It consists of a daemon and a table manipulator. You can use it a similar way as the regular cron. The difference is that the inotify cron handles filesystem events rather than time periods.
这个程序是一个 “inotify cron” 系统。它由一个守护进程和一个表操作器组成。你可以像使用普通的 cron 一样使用它。区别在于 inotify cron 处理文件系统事件而不是时间段。

简单概括一下(译自http://inotify.aiken.cz):
incron 提供了一个简单的方法来解决许多和许多不同的情况。每当某些事情取决于文件系统事件时,它就是 incron 的工作。
在这里你可以看到几个例子,incron 是一个很好的解决方案:

  • 通知程序(例如服务器守护程序)有关配置的更改
  • 保护关键文件的变化(最终恢复)
  • 文件使用情况监控,统计
  • 自动碰撞清理
  • 自动更新备份或版本控制
  • 新邮件通知(maildir)
  • 服务器上传通知
  • 安装管理(外包装系统)

Incron 安装

Centos7 下执行以下命令

1
2
3
yum install incron
service incrond start
chkconfig incrond on

如果提示缺少包,你可以去下载:
pkgs.org

Ubuntu 则执行以下命令

1
sudo apt-get install incron

incrond 配置

使用 vi 编辑器

1
echo 'editor = vi' >> /etc/incron.conf # 修改 incrond 默认编辑器为 vi

incrond 使用

启动

1
service incrond start

停止

1
service incrond stop

状态(调试)

1
service incrond status

查看帮助信息

1
incrontab -h

添加触发任务

1
incrontab -e

重载

1
incrontab -d

incrond 任务

使用下面的命令添加触发任务

1
incrontab -e

incron 守护进程(incrond)必须在根目录下运行(通常来自运行级脚本等)。
命令格式:
<path> <mask> <command>

具体功能:
<path> 是一个文件系统路径(避免空格)
<mask> 是一个符号(请参阅 inotify.h; 使用逗号分隔符号)或事件的数字掩码
<command> 是在事件上运行的应用程序或脚本

<path> - 这是您要观看的目录的路径。请注意,Incron 无法观看子目录。只有路径中的文件将被监控。如果你需要监视子目录,你必须给他们自己的条目。

<mask> - 可以用下面的几个选项:

事件 含义
IN_ACCESS 文件被访问(读取)
IN_ATTRIB 元数据已更改(权限,时间戳,扩展属性等)
IN_CLOSE_WRITE 为写入而打开的文件已关闭
IN_CLOSE_NOWRITE 未打开文件已关闭
IN_CREATE 在监视的目录中创建的文件 / 目录
IN_DELETE 从监视目录中删除的文件 / 目录
IN_DELETE_SELF 监视的文件 / 目录本身已被删除
IN_MODIFY 文件已被修改
IN_MOVE_SELF 监视的文件 / 目录本身已移动
IN_MOVED_FROM 文件移出监视目录
IN_MOVED_TO 文件已移入监视目录
IN_OPEN 文件已打开

<command> - 这是在事件被触发时将运行的命令。代替命令,您始终可以使用通配符。通配符将在 syslog 中报告基本信息。可用的通配符是:

命令 含义
$$ 打印美元符号
$@ 添加观看的文件系统路径
$# 添加事件相关的文件名
$% 添加事件标志(文本)
$& 添加事件标志(数字)

incrond 举例

我放一下自己的 incrond 任务

1
/root/Dropbox/hexo/source/_posts/ IN_MOVE,IN_MODIFY,IN_CREATE,IN_DELETE /root/runhexo.sh

当 /root/Dropbox/hexo/source/_posts/ 文件夹发生变动的时候运行 / root/runhexo.sh

incrond 注意事项

我使用的时候,碰到了几个问题

使用 incrontab -e 编辑并保存后,任务未生效。
最后发现应该还要输入下面的命令重载一下

1
incrontab -d

使用下面的命令查看任务是否执行

1
service incrond status

没有 service incrond reload 这个命令,你可以自己自定义。
最后,不要忘记给脚本提权:

1
2
chmod -x runhexo.sh
chmod -R 777 /root/runhexo.sh

参考资料 & 转载来源

坚持原创技术分享,您的支持将鼓励我继续创作!