Incron 监控文件和文件夹

21 min read

什么是 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 下执行以下命令

yum install incron
service incrond start
chkconfig incrond on

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

Ubuntu 则执行以下命令

sudo apt-get install incron

incrond 配置

使用 vi 编辑器

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

incrond 使用

启动

service incrond start

停止

service incrond stop

状态(调试)

service incrond status

查看帮助信息

incrontab -h

添加触发任务

incrontab -e

重载

incrontab -d

incrond 任务

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

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 任务

/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 编辑并保存后,任务未生效。
最后发现应该还要输入下面的命令重载一下

incrontab -d

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

service incrond status

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

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