xjpvictor's Blog
小老鼠,上灯台,两只耳朵竖起来

systemd启动inotify


各种折腾·archlinuxlinuxscriptvps

inotify是内核自带的监控文件变动的工具。当然,要使用还是要安装命令行工具inotify-tools

但是和cron不同的是,inotify并没有作为可以开机启动的服务。所以必须由脚本启动。

systemd

为了和rc.local体系兼容,也为了方便以后添加需要开机运行的命令,所以自己写一个开机运行/etc/rc.local的systemd服务/etc/systemd/system/rc-local.service

[Unit]
Description=/etc/rc.local Compatibility
After=iptables.service syslog-ng.service

[Service]
Type=oneshot
ExecStart=/etc/rc.local
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

需要注意的是Type=oneshot。因为inotify的监控脚本需要一直在后台运行,所以rc-local.service需要允许/etc/rc.localfork,而Type=simple是不允许fork的,所以使用oneshot模式。

添加rc-local.service到systemd后,开机就会由systemd以root执行/etc/rc.local

inotify

再次新建一个可执行脚本,my_inotify.sh,这就是真正的用来监控目录的脚本了。

#!/bin/bash

while /usr/bin/inotifywait -sr -e attrib,modify,create,delete "${1}"
do
  ## WHATEVER YOU WANT TO DO
done

这个脚本会一直循环,但是只有当inotifywait返回结果时,才会执行DO里面的命令,在这个命令运行结束后,再次运行inotifywait并等待结果。

inotifywait会在监控目录有attrib,modify,create,delete事件时返回结果,否则就一直等待。

所以,只有当事件发生时才会执行一次循环,而事件不发生时循环处于等待inotify的状态,并不耗费系统资源。由于inotify只会运行一次,事件发生后就退出了,所以需要循环在事件发生以后再次执行inotify并等待下一次事件发生。

需要注意的是inotifywait不可以-m或者-d模式运行,因为这两种模式都不会返回结果,所以循环也就不会执行了。

rc.local

接下来就要建立一个可执行的/etc/rc.local

#!/bin/bash

full_path_to_my_inotify_script.sh dir_to_watch &

本文 "systemd启动inotify" 由 K. Huang 首先发表于 xjpvictor's Blog 并以 CC BY-NC 4.0 许可证发布 © 2017
转载注明引用来源 https://blog.xjpvictor.info/2017/04/inotify-on-boot-for-systemd/

赞助我

评论

你的邮箱地址不会被公开。必填项以 * 标出

无意义或不相关评论将被删除

取消 上传图片 或拖拽上传

* Some files will not be uploaded. Only png, gif, jpg are allowed and maximum 10 images, each file less than 10M.

你可以添加 10 个 png/gif/jpg 图片 (每个文件小于 10M)

允许使用以下html标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

你可以上传文件,粘贴代码或长文至 Drop.it.r

更多相似文章