本教程将向您展示如何在Ubuntu 16.04(Xenial Xerus)系统上使用incron在文件或目录更改时运行命令。 电脑守护程序与cron类似,但是不是基于时间运行命令,它可以在文件或目录事件发生时触发命令(例如,文件修改,权限更改等)。
1安装Incron
以下步骤必须以root用户身份运行。 请登录到您的Ubuntu系统的shell,并成为root用户:
sudo -s
Incron软件在Ubuntu存储库中可用。 因此,我会像这样安装它:
apt-get -y install incron
3如何使用Incron
如第一章所述,Incron与Cron工具有很多相似之处。 在Cron拥有crontab命令来管理cronjobs的情况下,Incron具有命令incrontab。 您可以使用incrontab
命令选项列表( -l
),编辑( -e
)和删除( -r
)来显示和更改incrontab条目。
运行以下命令以获取关于incrontab的完整概述:
man incrontab
在手册页中,您将找到以下注释:
如果/etc/incron.allow存在,则此处列出的用户只能使用inc龙。 否则,如果/etc/incron.deny存在,则此处未列出的用户可能会使用inc龙。 如果没有这些文件存在,每个人都可以使用inc子。 (重要提示:此行为不安全,可能会更改为与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
创建肛门工作。 现在让我们深入了解手册页以了解语法。
man 5 incrontab
该手册页显示了cron标签行的格式。 格式遵循以下方案:
<path> <mask> <command>
...其中<path>
是目录或文件。 请注意,incron无法在您设置的目录的子目录中查看文件,因此只能观察该目录中的文件。
<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_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)
如果您看目录,则$ @
保存目录路径, $#
保存触发事件的文件。 如果你看一个文件,那么$ @
保存文件的完整路径, $#
是空的。
如果你需要通配符,但是不知道他们翻译的是什么,你可以创建一个这样的工作。
创建一个应该被监视的目录:
mkdir /tmp/testdir
然后打开incrontab:
incrontab -e
并添加以下行:
/tmp/testdir/ IN_MODIFY echo "$$ $@ $# $% $&"
然后,您创建或修改/ tmp / testdir /目录中
的文件,并查看/ var / log / syslog
- 此日志显示何时触发了某个工作,如果成功或有错误,以及实际命令是它执行(即,通配符被替换为其真实值)。
为了测试的目的,我将在/ tmp / testdir /中添加两个文件helloworld.txt和helloworld2.txt:echo命令:
echo 'How are you?' > /tmp/testdir/helloworld.txt
echo 'How are you?' > /tmp/testdir/helloworld2.txt
所以我们来检查syslog的尾巴是否有效:
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")
现在足够的理论 让我们创造我们的第一个工作。 我想监视文件/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:~#