如何在 Ubuntu 上使用 Incron 对文件或目录更改运行命令如何在 Ubuntu 上使用 Incron 对文件或目录更改运行命令如何在 Ubuntu 上使用 Incron 对文件或目录更改运行命令如何在 Ubuntu 上使用 Incron 对文件或目录更改运行命令
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Ubuntu 上使用 Incron 对文件或目录更改运行命令

本教程适用于这些操作系统版本

  • Ubuntu 16.04(Xenial Xerus)
  • Ubuntu 15.10(Wily Werewolf)

在此页

  1. 1 安装 Incron
  2. 3 如何使用Incron
  3. 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>

...其中 是目录或文件。请注意,incron 无法观察您设置的目录的子目录中的文件,因此只会观察该目录中的文件。

可以是以下选项之一:

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

©2015-2025 艾丽卡 support@alaica.com