前言
本文介绍了如何应用 Incron 结合 Rsync 在 Linux 下进行实时文件同步。Incron 是基于 Inotify 文件系统事件触发的计划任务工具,而 Rsync 是一款增量备份工具,二者结合,可实现实时文件(增量)同步的需求。
本文要实现的目标
如果读者是 Linux 用户,你是否有把本地文件上传到远程服务器,或者本地复制到本地的需求,有时还要在文件改变时与目标立即进行同步的进一步需求?
如果有,那么就请阅读这篇文章。这篇文章将带你走进如何在 Linux 下进行实时的文件同步。
实时同步与基于时间间隔/定时的同步
一般地,Linux 使用者使用Cron 按设定的时间进行脚本的定时执行,那些符合定时执行需求的场景中,这种定时执行是好吃的“甜甜圈”,正好方便了人们。
然而,如果你需要实时无差异地进行同步,Cron 就显得有些不够用了。比如在本地电脑上进行代码的开发,然后上传至远程服务器进行执行和调试;在这种情况下,实时更新远程目录就成为了新的需求。
实时的原理
Linux 下的实时文件监视依赖于一种内核子系统,该核心子系统名叫Inotify。
Inotify 基于文件的 inodes,区别文件是否改动,它关注文件 的 inode 的变化。
它不是一个成型的软件,而是一套 API(应用编程接口),它提供函数形式的接口。
应用程序用它来监视目录/文件的更改,被监视的文件一经改动,该 API 便会通知应用程序来做下一步的操作。
如何去处理这种通知,以及如何来做下一步的操作,由应用程序决定,或应用程序作为经纪,并由外部程序,如 Shell 脚本程序进行处理。incron 就是这样的应用程序。
基于事件触发
Inotify 是在版本号为 2.6.13 的 Linux 内核中集成进去的,自此之后就成为 Linux 内核的一个核心子系统。
它以事件为触发条件来监控文件系统的改动。这些事件包括不限于写入、元数据改变、重命名、读取、删除、创建等等。
检查系统内核是否支持 Inotify
- 方法一: 终端执行命令
ls /proc/sys/fs/inotify/,如果列出以下文件,则表示系统支持 Inotify:max_queued_events max_user_instances max_user_watches以上三个文件决定着系统中Inotify 能监视文件的最大数目。具体的请关注下未来的文章。
-
方法二: 执行命令
grep INOTIFY_USER /boot/config-$(uname -r),如果显示以下的内容,则表示支持Inotify“:CONFIG_INOTIFY_USER=y
Incron
incron 是一款行为类似于 Linux 下的计划程序Cron 的应用程序,称为 “Inotify cron”。
它模仿Cron 的实现,两者的表操作有极其相似的特点。
不同的是,Cron 基于时间点为触发条件,而incron 以文件系统事件为触发条件,然后来执行其他应用程序,如 Shell 脚本。
基本概念
上文提到,incron 基于Inotify,其核心以Inotify 提供的 API 为监控文件系统改动的基础。
除此之外,具体什么是incron?它有哪些行为?
incron 安装到 Linux 机器后,它就分为两大部分,每个部分各司其职。
其一是incron 的守护进程incrond,incrond 负责监控文件系统的更改,
以及执行表定义的命令(包括应用程序,如 Shell 脚本或其他)。
其二就是定义和管理incron 表的incrontab。
经过配置后,incrontab 中的每一行就是incron 表的规则,表规则中设置有要监控的目录/文件、触发的文件系统事件,以及文件系统事件触发后要执行的应用程序。
至于如何定义表,请继续阅读后面内容。
Linux 安装 incron
Debian 系操作系统
sudo apt update
sudo apt install -y incron
Fedora 系操作系统
# 非 root 用户要添加 sudo
dnf install -y epel-release
dnf clean all
dnf makecache
yum install -y incron
# 或
dnf install -y incron
Arch Linux
sudo pacman -S rsync
命令参数
在前台运行
-n 或 --foreground:在前台运行incrond。
非 root 用户需要 sudo。
这对测试、调试和优化起着重要的作用。
结束正在运行的守护进程实例
-k 或 --kill:终止正在运行的守护进程的实例。
非 root 用户需要 sudo。
指定守护进程配置文件的路径
-f <FILE> 或 --config=<FILE>:指定配置文件的其他路径。
默认的配置文件位于 /etc/incron.conf。
更多关于 incrond 的介绍,请阅读文档: man incrond。
incron 的两种运行方式——前台运行和守护进程
在前台运行 incrond
只须运行:
# 在非 root 用户下
sudo incrond -n
# 或
sudo incrond --foreground
# 在 root 用户下可不用 sudo
在前台运行的时候,产生的标准错误输出将输出到屏幕上。
想要结束它,可以在其他终端执行 sudo incrond -k,或者直接 Ctrl c。
基于 SystemD 守护进程的启动
一般情况下,系统通过安装软件包的方式安装的 incron 都带有 SystemD 的启动文件。
此时,只需要以下命令便可启动 incron 的守护进程:
sudo systemctl start incron.service
# 或者
sudo systemctl start incrond.service
查看启动状态:
systemctl status -l incron.service
或者:
systemctl status -l incrond.service
开机启动:
sudo systemctl enable incron.service
# 或者
sudo systemctl enable incrond.service
关于表
incron 的表根据创建者有两种类型,其中一个是系统创建的系统表,另一个是用户创建的用户表。
用户表包含 root 用户和其他用户。
系统表所指定运行的命令具有 root 用户的权限,而用户表具有其相应用户的权限。
并且,按照规定,用户表只能监控自身具有读权限的相应目录和文件。
用户表以用户名称为文件名,存放在 /var/spool/incron/ 目录路径下;而系统表存入于 /etc/incron.d/ 目录路径下。
要访问 /var/spool/incron/ 需要 root 用户或 sudo 权限。
incrontab
incrontab 是 Inotify cron(incron)的表操纵器。它创建、删除、修改和列出用户表。
每个用户具有自己的表,任何给定的表中的命令将作为拥有该表的用户执行。
当表被修改时,或者守护进程启动时,incron 都会读取 incrontab 表,表与 incrond 进行挂钩。
表的命令参数
后记
本文详述了如何在 Linux 下进行实时的文件同步。在多个章节中,
详细介绍了什么是 Inotify、incron、incrond、incrontab 和文件事件(掩码)等等实时同步的必要基础知识。
文章的后面还介绍了基于 SSH 的Rsync 文件传输,同时也通过Rsync 示例说明如何在不使用 SSH 默认端口和使用 SSH 密钥的方式登录 SSH 通道来传输文件数据。
在文章的最后,举了个 Rsync 和 incron 配合的实例来验证文件的实时同步。
由于篇幅原因,还有许多的内容不能全部一一列举出来,还望见谅!
在后续的篇章中,可能还会继续有关于Rsync 和incron 的文章发布出来。
请关注一下网站和微信公众号获取最新文章。
鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。
本文章可以转载,但是需要说明来源出处!
本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com


