如何在 Ubuntu 上使用 Incron 对文件或目录更改运行命令
本教程适用于这些操作系统版本
- Ubuntu 16.04(Xenial Xerus)
- Ubuntu 15.10(Wily Werewolf)
在此页
- 1 安装 Incron
- 3 如何使用Incron
- 4 个链接
本教程向您展示如何在 Ubuntu 系统上使用 incron 在文件或目录更改时运行命令。 incron 守护进程与 cron 类似,但它不是基于时间运行命令,而是可以在文件或目录事件发生时触发命令(例如文件修改、权限更改等)。
1 安装英康
以下步骤必须以 root 用户身份运行。请登录到您的 Ubuntu 系统的 shell 并成为 root 用户:
sudo su
Incron 软件在 Ubuntu 存储库中可用。因此,我将像这样使用 apt 安装它:
apt-get install incron
3 如何使用英康
如第一章所述,Incron 与 Cron 工具有许多相似之处。 Cron 有它的 crontab 命令来管理 cronjobs,Incron 有命令 incrontab。您可以使用 incrontab 命令选项列表 (-l)、编辑 (-e) 和删除 (-r) 来显示和更改 incrontab 条目。
运行以下命令以全面了解 incrontab:
man incrontab
在手册页中,您会发现以下注释:
如果 /etc/incron.allow 存在,则只有此处列出的用户可以使用 incron。否则,如果 /etc/incron.deny 存在,只有未在此处列出的用户可以使用 incron。如果这些文件都不存在,则每个人都可以使用 incron。 (重要说明:此行为是不安全的,可能会更改为与 ISC Cron 使用的样式兼容。)这些文件的位置可以在配置中更改。
这意味着如果我们想以 root 身份使用 incrontab,我们必须删除 /etc/incron.allow(这是不安全的)...
rm -f /etc/incron.allow
...或者我们将 root 用户添加到 incron.allow 文件(这是推荐的选项)。打开 /etc/incron.allow 文件:
nano /etc/incron.allow
并添加以下行。
root
在执行此操作之前,您将在尝试使用 incrontab 时收到类似这样的错误消息:
server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#
之后它起作用了:
server1:~# incrontab -l
no table for root
server1:~#
我们现在可以使用这个命令:
incrontab -e
创建 incron 作业。现在让我们更深入地查看手册页以了解语法。
man 5 incrontab
联机帮助页显示了 cron 选项卡行的格式。格式遵循以下方案:
<path> <mask> <command>
...其中
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 符号定义为上述所有事件的位掩码。两个额外的便利符号是 IN_MOVE,它是 IN_MOVED_FROM 和 IN_MOVED_TO 的组合,以及 IN_CLOSE,它组合了 IN_CLOSE_WRITE 和 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
此外,还有一个符号未出现在 inotify 符号集中。它是 IN_NO_LOOP。该符号禁用监视事件,直到当前事件被完全处理(直到其子进程退出)。
$$ dollar sign
watched filesystem path (see above)
$# event-related file name
$% event flags (textually)
$& event flags (numerically)
如果您查看一个目录,那么 [email 包含文件的完整路径并且 $# 为空。
如果您需要通配符但不确定它们翻译成什么,您可以像这样创建一个 incron 作业。
创建一个应该被监视的目录:
mkdir /tmp/testdir
然后打开 incrontab:
incrontab -e
并添加以下行:
/tmp/testdir/ IN_MODIFY echo "$$ $# $% $&"
然后您在 /tmp/testdir/ 目录中创建或修改一个文件并查看 /var/log/syslog - 此日志显示 incron 作业何时被触发,是否成功或是否有错误,以及实际发生了什么命令是它执行的(即,通配符被替换为它们的真实值)。
出于测试目的,我将使用 echo 命令在 /tmp/testdir/ 中添加两个文件,helloworld.txt 和 helloworld2.txt:
echo 'How are you?' > /tmp/testdir/helloworld.txt
echo 'How are you?' > /tmp/testdir/helloworld2.txt
因此,让我们用 tail 检查 syslog 是否有 incron 事件:
tail /var/log/syslog
...
Apr 12 18:49:22 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld.txt IN_MODIFY 2")
Apr 12 18:50:31 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld2.txt IN_MODIFY 2")
现在足够的理论。让我们创建我们的第一个 incron 作业。我想监视文件 /etc/apache2/apache2.conf 和目录 /etc/apache2/vhosts/,每当有变化时,我希望 incron 重新启动 Apache。这是我们的做法:
incrontab -e
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restart
就是这样。出于测试目的,您可以修改 Apache 配置并查看 /var/log/syslog,您应该会看到 incron 重新启动了 Apache。
注意:不要在您监控的目录中的 incron 作业中执行任何操作,以避免循环。示例:当您监视 /tmp 目录的更改并且每次更改都会触发在 /tmp 中写入日志文件的脚本时,这将导致循环并可能使您的系统负载过高甚至崩溃。
要列出所有已定义的 incron 作业,您可以运行:
incrontab -l
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /usr/sbin/service apache2 restart
server1:~#
要删除当前用户的所有 incron 作业,请运行:
incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#
4 个链接
- incron:http://inotify.aiken.cz/?section=incron&page=about&lang=en