incron:linux下基于文件的事件触发

一、什么是incron
linux下的cron大家可能都经常使用,即可以在指定时间运行指定程序的功能,而incron则是另外一类程序,其主要功能是在指定文件系统发生某些指定变化后运行指定程序。
incron这个名称就是inotify cron system的合体,意思就是基于inotify的cron系统。
官方网站的解释:

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.

二、如何使用incron
和cron的使用类似,incron主要采用incrontab命令来进行控制。当然,cron在linux系统都已经是配置好了,但incron则不同,其在linux内核2.6.13才开始支持的,在ubuntu里则可以这样安装:

sudo apt-get install incron

安装完成后还需要进行配置,默认安装的incron是禁止所有使用的。

sudo nano /etc/incron.allow

将root加入到其中,即允许root运行incron。
然后就可以使用incrontab -e来加入指定的监测,比如要监测某个脚本是否发生变化,发生变化后如何处理:

sudo incrontab -e

加入以下内容:

/var/www/proftp-user.sh IN_CLOSE_WRITE /root/incron-proftp.sh

即说明在/var/www/proftp-user.sh写关闭后即执行incron-proftp.sh脚本。

从上例中可以看出incrontab的基本格式,详细解释如下:

<path> <mask> <command>

其中,path可以是文件,也可以是目录,即被监测的文件;mask可以是下述模式:

IN_ACCESS           File was accessed (read) (*)
IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE      File opened for writing was closed (*)
IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
IN_CREATE           File/directory created in watched directory (*)
IN_DELETE           File/directory deleted from watched directory (*)
IN_DELETE_SELF           Watched file/directory was itself deleted
IN_MODIFY           File was modified (*)
IN_MOVE_SELF        Watched file/directory was itself moved
IN_MOVED_FROM       File moved out of watched directory (*)
IN_MOVED_TO         File moved into watched directory (*)
IN_OPEN             File was opened (*)

还有其他的模式,包括:

IN_ALL_EVENTS       all of the above events
IN_MOVE             a combination of IN_MOVED_FROM and IN_MOVED_TO
IN_CLOSE            combines IN_CLOSE_WRITE and IN_CLOSE_NOWRITE.

更多的模式:

IN_DONT_FOLLOW      Don't dereference pathname if it is a symbolic link
IN_ONESHOT          Monitor pathname for only one event
IN_ONLYDIR          Only watch pathname if it is a directory

command即事件发生后要运行的命令,命令中还可以支持一些特殊符号:

$$   dollar sign
$@   watched filesystem path (see above)
$#   event-related file name
$%   event flags (textually)
$&   event flags (numerically)

inotify还有一些其他有意思的工具,详细的可以参考这篇文章中文的见这篇:inoticoming,inosync, …
三、在westdc中的应用
在westdc中如何应用incron?最显而易见的就是FTP用户控制。之前一直使用cron来进行控制,用户申请通过需要在下一个正点时刻才生效,而由此也产生了很多的问题,如:
mediawiki导致的postgresql取当前时间为utc的问题
诡异的问题:时间不同步导致FTP用户地址丢失
而cron还限制了在线数据的支持,因为用户下载在线数据时应该是马上生效的。而使用incron应该就能解决这些问题,web服务器端只控制用户的申请审理,通过后即可通过某内部程序触发修改FTP服务器上的某个控制脚本,同时incron在FTP服务器上监测到控制脚本的变化后就可以让该用户的数据目录马上准备生效。
另外一个可能的应用就是文件列表的变化监测(这也是inotify产生的初衷),某条数据的文件列表发生变化后运行一个指定的程序来更新数据库中的对应文件列表。目前这个操作基本上是人工管理的。

四、使用中遇到的问题
在使用过程中,遇到了一些问题。
首先,如何判断你的incrontab是否执行?这个可以通过/var/log/syslog中查看:

sudo tail /var/log/syslog

其次,我在使用中遇到一个问题,我执行的command如下:

cp /var/www/proftp-user.sh /root/proftp-user.sh && chmod +x /root/proftp-user.sh && /root/proftp-user.sh

这个命令在bash下可以执行的,但在这里执行一直有问题,我估计可能是&&符号的问题,不过可以通过变通的方法解决,将这些命令放在一个独立的sh文件即可运行。


已发布

分类

,

来自

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注