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

加载更多搜索结果...

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

如何在 Debian 8 上使用 Incron 触发文件/目录更改命令

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

  • Debian 4(蚀刻版)

在此页

  1. 1 先决条件
  2. 2 安装 Incron
  3. 3 使用 Incron
  4. 4 个链接

本指南介绍了如何在 Debian 8 (Jessie) 系统上安装和使用 incron。 Incron 与 cron 类似,但它不是基于时间运行命令,而是可以在文件或目录事件发生时触发命令(例如文件修改、权限更改等)。

1 先决条件

  • 系统管理员权限(root 登录)。本教程中的所有命令都应在 Shell 上以 root 用户身份运行。
  • 我将使用编辑器 \nano\ 来编辑文件。如果您的服务器上没有安装 nano,您可以用您选择的编辑器替换 nano 或使用“apt-get install nano”安装 nano。

2 安装英康

Incron 在 Debian 存储库中可用,因此我们使用以下 apt 命令安装 incron:

apt-get install incron

安装过程应该类似于此屏幕截图中的过程。

3 使用英康

Incron 的用法与 cron 的用法非常相似。您可以使用 incrontab 命令列出 (-l)、编辑 (-e) 和删除 (-r) incrontab 条目。

要了解更多信息,请参阅:

man incrontab

您还可以在其中找到以下部分:

如果 /etc/incron.allow 存在,则只有此处列出的用户可以使用 incron。否则,如果 /etc/incron.deny 存在,只有未在此处列出的用户可以使用 incron。如果这些文件都不存在,则每个人都可以使用 incron。 (重要说明:此行为是不安全的,可能会更改为与 ISC Cron 使用的样式兼容。)这些文件的位置可以在配置中更改。

这意味着如果我们想以 root 身份使用 incrontab,我们必须删除 /etc/incron.allow(这是不安全的,因为这样每个系统用户都可以使用 incrontab)...

rm -f /etc/incron.allow

...或将 root 添加到该文件(推荐)。使用 nano 打开 /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 作业。在我们这样做之前,我们先看一下 incron 手册页:

man 5 incrontab

联机帮助页解释了 crontab 的格式。基本上格式如下...

<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 作业。打开 incron incrontab:

incrontab -e

并添加以下行:

/tmp/ IN_MODIFY echo "$$  $# $% $&"

然后您在 /tmp 目录中创建或修改一个文件并查看 /var/log/syslog - 此日志显示 incron 作业何时被触发、是否成功或是否有错误,以及实际命令是什么它执行了(即,通配符被替换为它们的真实值)。

tail /var/log/syslog
...
Sep 16 10:14:35 server1 incrond[1199]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Sep 16 10:14:36 server1 incrond[1199]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Sep 16 10:14:39 server1 incrond[1199]: (root) CMD (echo "$ /tmp hello.txt IN_MODIFY 2")
Sep 16 10:14:39 server1 incrond[1199]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")

在这个例子中,我编辑了文件 /tmp/hello.txt;如您所见,[email 转换为 /tmp,$# 转换为 hello.txt,$% 转换为 IN_CREATE,$& 转换为 256。我使用了一个创建临时 .txt.swp 文件的编辑器这会导致系统日志中出现额外的行。

现在足够的理论。让我们创建我们的第一个 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 个链接

  • Debian http://www.debian.org
  • incron:http://inotify.aiken.cz/?section=incron&page=about&lang=en

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