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

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

1先决条件

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

2安装Incron

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

apt-get install incron

安装过程应该与此屏幕截图中的相似。

3使用Incron

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

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

man incrontab

在那里您还可以找到以下部分:

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

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

rm -f /etc/incron.allow

...或添加到该文件的根(推荐)。 用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

创建肛门工作。 在我们这样做之前,我们来看看inc ron手册页:

man 5 incrontab

该手册页解释了crontabs的格式。 基本上格式如下:

<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符号被定义为所有上述事件的位掩码。 两个额外的便利符号是IN_MOVE ,它是IN_MOVED_FROMIN_MOVED_TO的组合IN_CLOSE组合IN_CLOSE_WRITEIN_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)

如果您看目录,则$ @保存目录路径, $#保存触发事件的文件。 如果你看一个文件,那么$ @保存文件的完整路径, $#是空的。

如果你需要通配符,但是不知道他们翻译的是什么,你可以创建一个这样的工作。 打开inc ron inc:

incrontab -e

并添加以下行:

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

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

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文件; 如您所见, $ @转换为/ tmp$#hello.txt$%IN_CREATE$&转换为256 。 我使用一个编辑器创建一个临时的.txt.swp文件,这会导致syslog中的其他行。

现在足够的理论 让我们创造我们的第一个工作。 我想监视文件/etc/apache2/apache2.conf和目录/ etc / apache2 / vhosts / ,每当有变化时,我想要inc ron重新启动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中写入日志文件的脚本,这将导致循环,并可能导致系统负载高或甚至将其崩溃。

要列出所有定义的肛门作业,您可以运行:

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链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏