前面我已经写了 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 下执行以下命令
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