inotify+rsync+shell 脚本实现实时数据同步

inotify+rsync+shell 脚本实现实时数据同步

应用场景:在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份服务器特定目录中.

1. inotify

Linux 的 inotify 是一个监视文件系统事件的内核子系统。它允许应用程序监控文件系统变化,比如文件的创建、删除、修改、属性更改等。inotify 在多种应用中非常有用,比如自动备份、同步、文件索引和安全监控系统等。

1.1 基本工作原理

当应用程序监控一个文件或目录时,inotify 将其添加到监视列表中。每当监视的对象发生更改时,inotify 会通知应用程序。这种机制比轮询文件系统以查找更改更高效,因为事件是由内核主动推送的。

1.2 核心特性

  • 事件驱动:应用程序可以接收关于文件系统更改的事件通知。
  • 监视项(Watches):可以对文件或目录设置监视项,以便在发生更改时接收通知。
  • 灵活性:可以选择监视各种类型的文件系统事件,如读取、写入、创建、删除等。

1.3 使用方法

要在程序中使用 inotify,需要通过 inotify_init() 系统调用创建一个 inotify 实例。然后,可以使用 inotify_add_watch() 向实例添加监视项,指定要监控的文件或目录以及感兴趣的事件。当这些事件发生时,应用程序可以通过从 inotify 文件描述符读取信息来接收事件通知。

下面是一些常用的 inotify 事件类型:

  • IN_ACCESS:读取文件时产生。
  • IN_MODIFY:文件被修改时产生。
  • IN_CREATE:在被监视的目录中创建了新文件时产生。
  • IN_DELETE:文件被删除时产生。
  • IN_OPEN:文件被打开时产生。
  • IN_CLOSE:文件被关闭时,如果是可写的则会收到 IN_CLOSE_WRITE,否则是 IN_CLOSE_NOWRITE
  • IN_MOVE:文件被移动时产生,移入事件是 IN_MOVED_TO,移出事件是 IN_MOVED_FROM

1.4 限制和注意事项

  • 资源限制inotify 使用资源限制来防止单个用户占用太多内核内存。这些资源限制可以通过 /proc/sys/fs/inotify/ 下的文件来配置,如 max_queued_eventsmax_user_instancesmax_user_watches
  • 缺少递归监视inotify 本身不支持递归监视目录树。如果需要递归监视,需要在应用程序中实现。
  • 不监视子目录:如果监视一个目录,对该目录的子目录进行的更改不会被通知,除非也为这些子目录单独添加监视。

1.5 使用 inotify 的工具

有许多工具和库使用了 inotify,包括但不限于:

  • inotify-tools:这是一组命令行程序,用于简单地使用 inotify 功能。
  • InotifyWatcher:在许多高级编程语言中,如 Python,都有封装了 inotify 功能的库。

通过 inotify,开发者可以更轻松地构建响应文件系统更改的智能应用程序,使得文件管理和处理在 Linux 系统上更加强大和灵活。

1.6 内核参数

inotify 是 Linux 内核的一个特性,它提供了一种机制,允许应用程序监视文件系统上的变化。许多现代 Linux 发行版都使用 inotify 来帮助文件管理器、编辑器、IDE和其他程序跟踪文件系统变化。这些 /proc/sys/fs/inotify/ 下的参数用来控制 inotify 的资源限制。

1.6.1 max_queued_events

这个参数控制的是 inotify 监视点对于事件队列的大小。它定义了可以排队的事件的最大数目。如果超过了这个数目,会向进程发送 IN_Q_OVERFLOW 事件,进程可能会错过一些事件。默认值通常是 16384。如果应用程序正在监视大量文件并且频繁更改,可能需要增加这个值。

1.6.2 max_user_instances

这个参数指的是每个真实用户 ID(real user ID)可以创建的 inotify 实例的数量。每个实例可以用来监视一个或多个文件。默认值通常是 128。这意味着任何用户不能创建超过这个数目的监视实例。这是为了防止单个用户消耗过多的内核资源。如果你的系统上有多个应用程序需要使用 inotify,可能需要增加这个值。

1.6.3 max_user_watches

这个参数定义了单个用户能够创建的 inotify 监视项(watches)的最大数量。每个监视项对应于一个被监视的文件或目录。默认情况下,这个值可能相对较低,对于那些需要监视大量文件的应用程序,可能需要增加这个值。

在开发或部署一个需要密切监控文件系统变化的应用程序,这些参数是可能需要调整的。调整它们可以帮助避免 inotify 相关的错误,例如在文件系统活动非常高的系统上。调整这些值可以使用 echo 命令将新的值写入对应的文件中,下面有两种修改方式:临时修改和永久修改。

1.6.4 临时修改

要临时修改这些值,可以直接向相应的文件写入新值。临时修改在系统重启后不会保留。使用 echo 命令配合重定向符号来修改这些值。例如:

echo 65536 > /proc/sys/fs/inotify/max_queued_events
echo 256 > /proc/sys/fs/inotify/max_user_instances
echo 65536 > /proc/sys/fs/inotify/max_user_watches

这些命令会立即生效,但重启后会恢复到默认值。

1.6.5 永久修改

要永久修改这些值,需要编辑 /etc/sysctl.conf 文件(或在 /etc/sysctl.d/ 目录下创建一个新的配置文件)。永久修改会在系统重启后保留。

echo "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.conf
#或者
fs.inotify.max_queued_events = 65536
fs.inotify.max_user_instances = 256
fs.inotify.max_user_watches = 65536

生效:

sysctl -p

请记住,修改这些参数可能会对系统资源有一定影响,因此在增加它们之前请确保了解这些更改的影响。特别是增加 max_user_watches 可能会显著增加内核消耗的内存,因为每个 watch 都会占用一定的内存空间。

1.7 inotify的使用配置

inotify 本身是 Linux 内核的一部分,因此不需要单独安装。然而,要使用 inotify 功能,可能会用到 inotify-tools,这是一组命令行程序用于简化 inotify 的使用。以下是如何安装、使用和配置 inotify-tools 的指南。

[09:50:13 root@Rocky8 ~]#grep -i inotify /boot/config-4.18.0-372.9.1.el8.x86_64
CONFIG_INOTIFY_USER=y
[09:50:22 root@Rocky8 ~]#
1.7.1 安装 inotify-tools

在大多数基于 Debian 的系统(如 Ubuntu)中,可以使用 apt 包管理器来安装:

sudo apt update
sudo apt install inotify-tools

对于基于 RHEL 的系统(如 CentOS 或 Fedora),使用 dnfyum

sudo dnf install inotify-tools
1.7.2 使用 inotify-tools

inotify-tools 包括两个主要的工具:inotifywaitinotifywatch。详细命令[参考这里](# 相关命令)

2. rsync

rsync 是一个非常流行的 Linux/Unix 命令行工具,它用于快速有效地同步文件和目录之间的数据。rsync 可以通过本地链接、SSH 或者 rsync 守护进程来同步数据,并且它被广泛用于备份和镜像。rsync 是一个非常灵活的工具,它可以作为客户端工具使用,也可以配置为服务端程序。rsync 的这种双重功能使其非常适用于文件同步和备份场景。以下是对其客户端和服务端功能的简要说明:

2.1 客户端工具

作为客户端工具,rsync 用于将本地文件同步到远程服务器或从远程服务器同步到本地。客户端通常调用 rsync 命令,指定源文件/目录和目的地,目的地可以是本地路径或远程服务器的路径。通过 SSH 或 rsync 守护进程进行通信。例如:

# 将本地目录同步到远程服务器
rsync -avz /local/directory/ user@remote-server:/remote/directory/

# 从远程服务器同步目录到本地
rsync -avz user@remote-server:/remote/directory/ /local/directory/

这里,-a 代表归档模式,保持文件属性;-v 表示详细模式;-z 表示压缩数据以节省带宽。

2.1.1 特性
  • 效率rsync 仅同步改变了的文件部分,使用了所谓的增量备份技术。
  • 灵活性:可以复制链接、设备、所有者、群组信息和权限等,并保持文件的原始属性不变。
  • 安全性:可以通过 SSH 进行安全传输。
  • 支持删除:可以删除目的地中不再存在于源位置的文件。
2.1.2 安装 rsync

rsync 默认情况下应该已经安装在大多数 Linux 发行版上了。如果没有,可以使用包管理器进行安装。

在 Debian/Ubuntu 系统中:

sudo apt update
sudo apt install rsync

在 RHEL/CentOS 系统中:

sudo yum install rsync

或使用 dnf

sudo dnf install rsync
2.1.3 使用 rsync

rsync 通常作为一个命令行工具而非守护进程服务来使用。但是,它也可以配置为守护进程服务运行。详细命令[参考这里](# 相关命令)

基本的 rsync 使用命令如下:

rsync options source destination

例如,将 /src/dir 同步到 /dest/dir,并保留文件权限和所有权信息:

rsync -avz /src/dir /dest/dir

-a 参数代表“归档模式”,这会保留符号链接、文件权限等。
-v 参数表示“verbose”,输出详细过程信息。
-z 参数表示在传输时压缩数据。

如果要通过 SSH 同步到远程服务器:

rsync -avz -e ssh /src/dir user@remote_host:/dest/dir

这里,-e ssh 指明使用 SSH 作为数据传输的通道。

2.2 服务端程序

rsync 同时也可以作为服务端程序运行,这通常通过设置 rsync 守护进程来完成。服务端配置文件 (/etc/rsyncd.conf) 定义了可供客户端访问的模块(即目录),以及访问控制和权限等。例如:

2.2.1 rsyncd.conf文件

/etc/rsyncd.confrsync 守护进程的配置文件,它定义了服务器端 rsync 的行为和各个模块的设置。以下是一些常见的配置选项及其含义:

全局选项

这些选项适用于 rsync 守护进程的整体运行:

  • uid: 运行 rsync 进程的用户ID。通常为了安全,不使用 root 用户运行,默认是nobody身份。
  • gid: 运行 rsync 进程的组ID。
  • use chroot: 是否使用 chroot 环境运行 rsync。设置为 yes 可增加安全性,因为它限制了 rsync 进程对文件系统的访问。
  • max connections: 允许的最大并发连接数。超过此数目的连接请求会被拒绝。
  • pid file: 存储 rsync 守护进程 PID 的文件路径,用于确保不会启动多个守护进程实例。
  • log file: 日志文件的路径,用于记录 rsync 的操作日志。
  • timeout: 客户端闲置超时时间(秒),超过这个时间后服务器会断开连接。
  • motd file: “Message of the day” 文件的路径,此消息在客户端连接时显示。

模块选项

/etc/rsyncd.conf 中,你可以定义一个或多个模块,每个模块对应一个目录及其特定的访问规则:

  • [module name]: 方括号内定义一个模块的名称,后续行为该模块的设置。
  • path: 该模块对应的目录路径。
  • comment: 模块的描述信息,通常在客户端列出可用模块时显示。
  • read only: 指定模块是否为只读。默认通常为 true,即客户端只能从此模块下载文件,不能上传。
  • list: 是否允许客户端列出此模块。设置为 no 可以隐藏模块,增加安全性。
  • auth users: 指定可以访问此模块的用户名列表,用户名之间用空格分隔。
  • secrets file: 存储用户名和密码的文件路径,用于模块的身份验证。
  • hosts allow: 允许访问此模块的 IP 地址或地址范围。
  • hosts deny: 禁止访问此模块的 IP 地址或地址范围。
  • max connections: 此模块允许的最大并发连接数。

示例配置文件:

# 在一些发行版没有这个文件,需要手动创建;但是在高版本上面,是有这个文件,无需手动创建。例如:Rocky Linux 9.0以上版本,安装rsync包以后会自动生成rsyncd.conf文件,但是包括rocky linux 8、以及centos 8以下是没有的,需要手动创建。有这个配置文件以后才可以启动服务也就是rsync --daemon,否则无法启动服务。
# /etc/rsyncd.conf 示例
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
lock file = /var/run/rsyncd.lock
uid = root
gid = root
port = 873
use chroot = no
max connections = 0
ignore errors
exclude = lost+found/
reverse lookup = no
[backup]
    path = /path/backup
    comment = Backup folder
    read only = yes
    list = yes
    auth users = rsyncuser
    secrets file = /etc/rsyncd.secrets



# 然后在 `/etc/rsyncd.secrets` 文件中设置用户和密码:
user:password

# 设置权限,否则无法通过客户端连接
chmod 600 /etc/rsyncd.secrets

# 最后,启动 `rsync` 守护进程
rsync --daemon

在这个例子中,创建了一个名为 backup 的模块,指定了路径、读权限和认证信息。

客户端可以直接通过 rsync 协议连接到服务端的特定模块来同步数据:

rsync -avz username@server::backup /local/backup/directory/

这里,username@server::backup 表示连接到远程服务器上名为 backup 的 rsync 模块。

2.2.2 创建service 文件

在某些发行版中,安装 rsync 包时不会自动包含 rsync-daemon 的 systemd 服务文件。但是,某些发行版提供了一个分离的包 rsync-daemon,这个包会包含必要的服务文件,用于通过 systemd 来管理 rsync 作为守护进程的运行。

如果 rsync-daemon 包可用,你可以通过安装这个包来自动获取并配置 rsync 守护进程的服务文件。在基于 Red Hat 的系统中,你可以使用如下命令来安装:

sudo dnf install -y rsync-daemon

[root@Rocky9 ~]# rpm -ql rsync-daemon
/etc/sysconfig/rsyncd
/usr/lib/systemd/system/rsyncd.service
/usr/lib/systemd/system/rsyncd.socket
/usr/lib/systemd/system/rsyncd@.service
[root@Rocky9 ~]#

[root@Rocky9 ~]# cat /usr/lib/systemd/system/rsyncd.service
[Unit]
Description=fast remote file copy program daemon
ConditionPathExists=/etc/rsyncd.conf
Wants=network-online.target
After=network-online.target

[Service]
EnvironmentFile=/etc/sysconfig/rsyncd
ExecStart=/usr/bin/rsync --daemon --no-detach "$OPTIONS"

[Install]
WantedBy=multi-user.target
[root@Rocky9 ~]#

发现生产了对应的service文件,设置开机自启

[root@Rocky9 ~]# systemctl enable --now rsyncd
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.
[root@Rocky9 ~]#

# 如果之前使用的rsync --daemon启动的,首先要killall rsync,然后执行systemctl restart rsyncd

请记住,当运行 rsync 守护进程时,你需要确保相应的端口(默认是 873)在防火墙中是开放的,并且 rsync 守护进程配置得当,以确保系统安全。

3. inotify+rsync+shell 脚本实现实时数据同步

image-20240416134647344

[root@backup-server ~]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode

# See rsyncd.conf man page for more options.

# configuration example:

# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# [ftp]
#        path = /home/ftp
#        comment = ftp export area
[backup]
path = /data/backup
read only = no
[root@backup-server ~]#

# 客户端连接
[13:52:49 root@data-server ~]#rsync rsync://10.0.0.107
backup
[14:24:32 root@data-server ~]# rsync 10.0.0.107::
backup

# 在服务器端修改配置允许上传、并且文件系统权限也得修改
[root@backup-server ~]# setfacl -m u:nobody:rwx /data/backup/

# 客户端上传
[14:27:23 root@data-server ~]#rsync /etc/networks root@10.0.0.107::backup
[14:39:29 root@data-server ~]#rsync /etc/hosts xing@10.0.0.107::backup
[14:39:53 root@data-server ~]#rsync /etc/fstab  10.0.0.107::backup

# 如果服务器端权限不够提示下面错误
[14:25:11 root@data-server ~]#rsync /etc/networks root@10.0.0.107::backup
rsync: [receiver] mkstemp "/.networks.MblLMy" (in backup) failed: Permission denied (13)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1189) [sender=3.1.3]
[14:27:23 root@data-server ~]#

# 服务器端查看
[root@backup-server ~]# ll /data/backup/
total 12
-rw-r--r-- 1 nobody nobody 709 Apr 16 14:40 fstab
-rw-r--r-- 1 nobody nobody 158 Apr 16 14:39 hosts
-rw-r--r-- 1 nobody nobody  58 Apr 16 14:28 networks
[root@backup-server ~]#
#也可以将远程的文件传回到本机


# 实现验证功能
[root@backup-server ~]# vi /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
lock file = /var/run/rsyncd.lock
uid = root
gid = root
port = 873
use chroot = yes
max connections = 0
ignore errors
exclude = lost+found/
reverse lookup = no
[backup]
    path = /data/backup
    comment = Backup folder
    read only = no
    list = yes
    auth users = rsyncuser
    secrets file = /etc/rsyncd.secrets

# 客户端测试
[14:54:42 root@data-server ~]#rsync /etc/group rsync://rsyncuser@10.0.0.107/backup
Password:
[14:57:36 root@data-server ~]#

# 查看服务器端是否上传成功
[root@backup-server ~]# ll /data/backup/
total 16
-rw-r--r-- 1 nobody nobody 709 Apr 16 14:40 fstab
-rw-r--r-- 1 root   root   600 Apr 16 14:57 group
-rw-r--r-- 1 nobody nobody 158 Apr 16 14:39 hosts
-rw-r--r-- 1 nobody nobody  58 Apr 16 14:28 networks
[root@backup-server ~]#

# 交互式输入密码不方便写脚本,看清楚这里是客户端,将密码存放在客户端的配置文件当中,为了方便脚本自动化执行,但是真正起到验证环节的还是服务器/etc/rsyncd.secrets文件写的rsyncuser:123456,如果把这个文件删除了就没法验证了,报错。
[root@data-server ~]# echo "123456" > /etc/rsyncd.secrets
# 修改权限
[root@data-server ~]# chmod 600 /etc/rsyncd.secrets
[15:26:52 root@data-server ~]#rsync --password-file=/etc/rsyncd.secrets /etc/sysctl.conf rsyncuser@10.0.0.107::backup
[15:30:01 root@data-server ~]#

监控脚本

vim inotify_rsyncd.sh
#!/bin/bash

# 定义源目录和目标服务器信息
SRC='/data/www/' # 确保路径以斜杠结尾,如果没有/就拷贝的整个www文件夹,有了,那么就是www下面的文件
DEST='rsyncuser@rsync服务器IP::backup'
LOG_FILE="/var/log/changelist.log"

# 检查并安装rsync
rpm -q rsync &>/dev/null || yum -y install rsync

# 使用inotifywait监控目录
inotifywait -mrq --exclude '.*\.swp' --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f %e' -e create,delete,moved_to,close_write,attrib ${SRC} |
while IFS=' ' read -r DATE TIME DIR FILE EVENT; do
    FILEPATH="${DIR}${FILE}"
    # 同步文件到远程服务器
    rsync -az --delete --password-file=/etc/rsyncd.secrets "${SRC}" "${DEST}" && \
    echo "At ${TIME} on ${DATE}, the file ${FILEPATH} was backed up via rsync due to ${EVENT}" >> "${LOG_FILE}"
done

这里解释一下IFS这个系统自带变量。在 Bash 脚本中,IFS(Internal Field Separator)是一个特殊的环境变量,用于定义如何在各种命令中分隔字段、参数和文本。IFS 通常用于 read 命令和脚本中的循环,以确定如何分割字符串成多个字段。你不能随意使用其他变量名替代 IFS,因为它是 Bash shell 的内置变量,具有特定的功能和意义。

  • IFS=’ 'IFS 环境变量定义了 Bash 用来确定字段边界的一组字符。在这个例子中,将 IFS 设置为一个空格,意味着 read 命令将使用空格来分割输入行中的数据。可以理解为cut -d 选项,指定分隔符。
  • read -r DATE TIME DIR FILE EVENTread -r 读取一行数据,-r 参数防止反斜杠转义字符被解释。DATE, TIME, DIR, FILE, EVENT 是变量名,它们将按顺序接收由空格分隔的输入数据。

工作原理:

inotifywait 输出一行信息时,它会按照 --format 指定的格式输出。例如,如果 --format 被设置为 '%T %w %f %e',那么输出可能看起来像这样:

2021-04-01 12:00:00 /path/to/directory/ changedfile.txt MODIFY
  • 2021-04-01 被赋值给 DATE
  • 12:00:00 被赋值给 TIME
  • /path/to/directory/ 被赋值给 DIR
  • changedfile.txt 被赋值给 FILE
  • MODIFY 被赋值给 EVENT

这里有几个关键组件:

  • inotifywait 命令: 这个命令调用 inotifywait 以监控文件系统事件。
    • -mrq: 这些是 inotifywait 的选项,其中 -m 表示持续监控,-r 表示递归监控所有子目录,-q 表示静默模式,不输出额外的信息。
    • --exclude '.*\.swp': 这个选项告诉 inotifywait 排除所有以 .swp 结尾的文件。.swp 文件通常是由 Vim 或其他文本编辑器创建的临时备份文件,你可能不想监控这些文件的变动。
    • --timefmt '%Y-%m-%d %H:%M:%S'--format '%T %w %f %e': 这些选项定义了输出格式。timefmt 设置时间的显示格式,format 指定了每个事件输出的信息,包括时间 (%T)、路径 (%w)、文件名 (%f) 和事件类型 (%e)。
    • -e create,delete,moved_to,close_write,attrib: 监控的事件类型。
  • 管道到 while 循环: 输出通过管道 (|) 传递给 while 循环,该循环使用 read 命令读取每行数据。
    • IFS=' ': 设置字段分隔符为空格,以正确地将 inotifywait 的输出分解成单独的变量。
    • read -r DATE TIME DIR FILE EVENT: 读取输入流中的数据,并将它们分配到相应的变量中,用于进一步处理。

客户端连接方式

当你使用 rsync 命令连接到一个 rsync:// URL时,这表明你正在尝试通过网络直接连接到运行在远程服务器上的 rsync 守护进程(daemon)。这种连接方式不依赖于 SSH 或其他远程shell,而是直接与 rsync 服务通信,通常用于高效的数据传输。

命令格式和解释

rsync rsync://10.0.0.107

这个命令的写法尝试连接到 IP 地址为 10.0.0.107 的服务器上的 rsync 守护进程。这种格式通常用于查询远程服务器上配置的可用 rsync 模块。

详细解释

  • rsync://:这是协议部分,指示 rsync 使用其内置的网络协议来通信。
  • 10.0.0.107:这是远程服务器的 IP 地址。

缺少部分信息

在实际使用中,仅仅使用 rsync rsync://10.0.0.107 命令可能不足以开始同步,因为它没有指定特定的模块名或文件路径。通常,rsync 守护进程会配置多个模块,每个模块对应服务器上的不同目录,客户端需要指定其中一个模块来进行数据传输。

完整的使用示例

假设在服务器 10.0.0.107 上有一个模块名为 data,你想从这个模块同步文件到本地目录 /local/dir,你可以使用以下命令:

rsync -av rsync://10.0.0.107/data /local/dir

这里的 -a 选项是归档模式,它包含了多个选项,如递归复制、保持符号链接、保持权限等。-v 选项表示详细模式,会显示更多的同步信息。

查询可用模块

如果你只输入 rsync rsync://10.0.0.107,通常的行为(取决于 rsync 服务器的配置)是返回一个可用模块的列表,这有助于了解你可以访问哪些资源。

rsync rsync://10.0.0.107/

这将列出远程 rsync 服务器上所有公开可用的模块,以及可能的一些关于这些模块的描述信息。这对于确定你应该连接到哪个模块非常有帮助。如果服务器正确配置了公开信息,这个命令可以告诉你更多关于如何与该服务器进行有效同步的细节。

4.相关命令

4.1 rsync

rsync 是一种常用于备份和同步文件的命令行工具,它具有高效、灵活的特点。rsync 可以在本地或者通过网络在不同的系统之间同步文件和目录。其核心优势在于,它只传输文件的变化部分,而不是每次都传输整个文件,从而显著提高效率。下面将详细介绍 rsync 的基本用法和一些常见的使用案例。

# 选项:
文件传输选项
--verbose, -v: 增加输出的详细程度,帮助用户了解正在发生的事情。
--info=FLAGS: 允许你更细致地控制哪些额外的操作信息被输出。
--debug=FLAGS: 提供详细的调试信息,有助于问题诊断和理解 rsync 的行为。
--stderr=e|a|c: 控制标准错误输出的模式;e=errors only, a=all, c=compress (即只显示错误,显示所有,或压缩输出)。
--quiet, -q: 抑制非错误信息,使输出更清洁。
--no-motd: 在使用 rsync 守护进程时,不显示消息日志。
文件选择与忽略
--checksum, -c: 基于文件校验和而非文件的修改时间和大小来决定是否同步。
--archive, -a: 归档模式,包括许多保持文件属性的选项,相当于-rlptgoD(但不包括 -H, -A, -X)。
--no-OPTION: 关闭一个默认的选项(例如 --no-D)。
--recursive, -r: 递归到目录中。
--relative, -R: 使用相对路径名。
--no-implied-dirs: 在使用相对路径名时不发送隐含的目录路径。
备份和版本控制
--backup, -b: 创建被覆盖或删除文件的备份。
--backup-dir=DIR: 指定备份文件的存放目录。
--suffix=SUFFIX: 指定备份文件的后缀,默认为 ~。
更新控制
--update, -u: 跳过那些目标中已经新于源中的文件。
--inplace: 直接在目标文件上更新,不使用临时文件。
--append: 只追加数据到文件的末尾。
--append-verify: 追加模式下,使用现有文件数据的校验和。
目录处理
--dirs, -d: 传输目录而不递归。
--mkpath: 为目的地创建不存在的目录结构。
--links, -l: 复制符号链接作为符号链接。
--copy-links, -L: 将符号链接转换成引用的文件或目录。
--copy-unsafe-links: 仅转换指向源树外部的不安全的符号链接。
--safe-links: 忽略指向源树外部的符号链接。
--munge-links: 修改符号链接使其在接收端安全但不可用。
--copy-dirlinks, -k: 将指向目录的符号链接当作引用的目录复制。
--keep-dirlinks, -K: 在接收端将符号链接当作目录对待。
--hard-links, -H: 保持硬链接。
权限和属性
--perms, -p: 保持文件权限。
--executability, -E: 保持可执行文件的权限。
--chmod=CHMOD: 修改文件和目录的权限。
--acls, -A: 保持 ACL(访问控制列表)。
--xattrs, -X: 保持扩展属性。
--owner, -o: 保持所有者(仅超级用户)。
--group, -g: 保持文件组。
特殊文件处理
--devices: 保持设备文件(仅超级用户)。
--copy-devices: 将设备文件的内容作为普通文件复制。
--specials: 保持特殊文件。
--D: 同时保持设备文件和特殊文件。
时间属性
--times, -t: 保持文件修改时间。
--atimes, -U: 保持文件访问时间。
--open-noatime: 打开文件时不更新访问时间。
--crtimes, -N: 保持文件创建时间。
--omit-dir-times, -O: 不保持目录的修改时间。
--omit-link-times, -J: 不保持符号链接的修改时间。
高级控制选项
--super: 允许接收方进行超级用户操作。
--fake-super: 使用扩展属性来存储/恢复需要超级用户权限的文件属性。
--sparse, -S: 为了节约磁盘空间,将一系列的空字节(nulls)转换为稀疏块。
--preallocate: 在写入文件之前预先为其分配空间。
--write-devices: 将设备文件的内容作为普通文件直接写入(这通常需要使用 --inplace 选项)。
效率和性能选项
--dry-run, -n: 模拟运行,不进行实际的文件传输,通常用于测试。
--whole-file, -W: 不使用增量更新算法,而是传输整个文件,适用于本地网络。
--checksum-choice=STR: 选择使用特定的校验和算法。
--one-file-system, -x: 不跨越文件系统边界。
--block-size=SIZE, -B: 强制使用固定的校验和块大小。
远程操作和网络控制
--rsh=COMMAND, -e: 指定用于连接远程系统的 shell 命令,例如 ssh。
--rsync-path=PROGRAM: 指定远程主机上 rsync 程序的路径。
删除控制
--delete: 在同步过程中删除那些在源目录中不存在的文件。
--delete-before: 先删除那些已经不存在于源目录中的文件,然后开始传输其他文件。
--delete-during: 在传输过程中删除不存在于源目录的文件。
--delete-delay: 延迟删除直到所有文件都被传输完成。
--delete-after: 同步完成后删除那些不存在于源目录中的文件。
--delete-excluded: 删除目标目录中被排除的文件。
错误和异常处理
--ignore-missing-args: 忽略缺失的源参数而不报错。
--delete-missing-args: 删除目的地中缺失的源参数。
--ignore-errors: 即使存在I/O错误也进行删除操作。
--force: 强制删除非空目录。
--max-delete=NUM: 限制删除的文件数量,防止意外删除过多文件。
文件大小限制
--max-size=SIZE: 不传输超过指定大小的文件。
--min-size=SIZE: 不传输小于指定大小的文件。
性能优化
--partial: 保留那些只传输了一部分的文件,以便再次尝试时可以继续使用这些部分完成传输。
--partial-dir=DIR: 将未完成传输的文件放入指定目录。
--delay-updates: 直到所有文件都成功传输完成后,再将它们一起移动到目标目录。
--prune-empty-dirs, -m: 删除空的目录链。
--numeric-ids: 不将用户和组 ID 转换为名称。
用户和组映射
--usermap=STRING: 映射用户名,按给定的规则修改文件所有者。
--groupmap=STRING: 映射用户组名,按给定的规则修改文件所属组。
--chown=USER:GROUP: 简单地更改文件的所有者和所属组。
超时和连接
--timeout=SECONDS: 设置I/O操作的超时时间。
--contimeout=SECONDS: 设置与守护进程的连接超时时间。
连续的命令选项
--password-file=FILE: 从指定文件中读取用于访问 rsync 守护进程的密码。这使得用户不必在命令行中手动输入密码,增加了脚本使用 rsync 的便利性和安全性。
--list-only: 仅列出源目录中的文件和目录,不进行任何文件传输。这对于查看将要同步的文件列表很有用,特别是在进行实际同步前的预检查阶段。
--bwlimit=RATE: 限制 rsync 使用的带宽,单位为 KB/s。这有助于控制 rsync 在网络上的数据传输,避免占用过多带宽资源。
--write-batch=FILE: 将变更记录到一个批处理文件中,之后可以使用这个文件来更新其他系统。这是一种高效的方式来将更新应用到多个目标上。
--only-write-batch=FILE: 创建一个批处理文件,但不执行实际的更新操作。这可以用于生成批处理文件,稍后再手动应用这些更改。
--read-batch=FILE: 从一个批处理文件中读取更改并应用它们。这通常与 --write-batch 生成的文件一起使用,用于将相同的更改应用到多个位置。
--protocol=NUM: 指定使用的 rsync 协议版本。这可以用于确保与旧版本的 rsync 兼容。
--iconv=CONVERT_SPEC: 在传输文件名时进行字符集转换。这对于在使用不同编码的系统之间同步文件时非常有用。
--checksum-seed=NUM: 设置用于文件校验和的种子。这是一个高级特性,可用于调整 rsync 的校验和行为。
完整性和性能选项
--ipv4, -4 和 --ipv6, -6: 分别指定使用 IPv4 或 IPv6 进行连接。这对于在特定类型的网络环境中运行 rsync 时确保网络兼容性非常有用。
--version, -V: 输出 rsync 的版本信息和其他一些系统信息,然后退出。这用于确认正在使用的 rsync 版本。
--help, -h: 显示 rsync 命令的帮助信息,然后退出。这是获取关于 rsync 选项和用法的快速帮助的一种方式。

rsync 是一种常用于备份和同步文件的命令行工具,它具有高效、灵活的特点。rsync 可以在本地或者通过网络在不同的系统之间同步文件和目录。其核心优势在于,它只传输文件的变化部分,而不是每次都传输整个文件,从而显著提高效率。下面将详细介绍 rsync 的基本用法和一些常见的使用案例。

基本语法
rsync [选项] 源 目标
User
Usage: rsync [OPTION]... SRC [SRC]... DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
  or   rsync [OPTION]... [USER@]HOST:SRC [DEST]
  or   rsync [OPTION]... [USER@]HOST::SRC [DEST]
  or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect
to an rsync daemon, and require SRC or DEST to start with a module name.

rsync 命令的使用方法表达了如何通过不同的方式来同步文件和目录,这包括本地复制、通过远程shell(如SSH)传输以及直接与 rsync 守护进程(daemon)通信。各种使用方式适用于不同的同步场景。下面是对各种用法的详细解释:

  • rsync [OPTION]... SRC [SRC]... DEST 这种用法是最简单的,用于在本地系统上从一个或多个源目录(SRC)同步到目标目录(DEST)。
  • rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST 使用这种方法,rsync 通过远程shell(通常是SSH)连接到另一台机器。这里,USER@HOST:DEST 指定了远程用户和主机,以及目标路径。如果省略 USER,则使用本地用户名。
  • rsync [OPTION]... [USER@]HOST:SRC [DEST] 这是上述用法的逆向操作,即从远程系统同步文件到本地系统。
  • rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  • rsync [OPTION]... [USER@]HOST::SRC [DEST] 这两种用法通过 :: 连接到运行在指定主机上的 rsync 守护进程。这种方式通常用于大规模的数据备份和镜像,因为它可以提供更多的服务器端控制,并且经常不需要用户验证。
  • rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
  • rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] 这两种方式也是连接到 rsync 守护进程,但使用的是 URL 格式的地址。如果指定了端口(PORT),则连接到该端口上的 rsync 守护进程;如果没有指定端口,通常默认为 873。

在与 rsync 守护进程通信时,SRCDEST 必须以模块名开头,模块名是在 rsync 守护进程配置文件中定义的,用于指定可访问的目录。

常用选项
  • -v (--verbose): 输出详细的过程信息。
  • -a (--archive): 归档模式,等于 -rlptgoD(递归、保持软链接、保持权限、保持时间、保持组、保持所有者、保持设备文件)。
  • -z (--compress): 在传输时压缩数据。
  • --delete: 删除那些存在于源位置但不存在于目的位置的文件。
  • -n (--dry-run): 模拟运行,实际上不传输文件。
  • -e (--rsh=COMMAND): 指定要使用的远程shell程序,常用来指定 ssh。
使用案例
1. 本地文件同步

同步本地两个目录,确保它们包含相同的文件。

rsync -av /path/to/source/ /path/to/destination/

如果源和目标目录后面加上斜杠 /rsync 会同步目录内容而不是目录本身。

2. 使用 SSH 进行远程同步

通过 SSH 同步本地文件到远程服务器。

rsync -avz -e ssh /path/to/local/dir/ user@remotehost:/path/to/remote/dir/

这个命令将本地目录 /path/to/local/dir/ 同步到远程主机上的 /path/to/remote/dir/ 目录,同时使用 -z 选项进行数据压缩,以加速传输。

3. 从远程服务器同步到本地
rsync -avz -e ssh user@remotehost:/path/to/remote/dir/ /path/to/local/dir/

这与上一例相反,是从远程服务器上同步文件到本地目录。

4. 定期备份

结合 cron 使用 rsync 进行定期备份。
首先,打开 crontab 配置:

crontab -e

添加以下行来每天凌晨执行备份:

0 0 * * * rsync -avz /path/to/source/ /path/to/backup/

这会在每天午夜时将源目录的内容备份到备份目录。

rsync 的用法远不止这些。这个工具非常灵活,可以应对各种复杂的文件传输和备份需求。下面还有一些进阶的使用技巧和选项,可以帮助你更好地利用 rsync 的功能。

5. 排除特定文件或目录

使用 --exclude 选项可以指定不希望同步的文件或目录。

rsync -av --exclude 'pattern' /path/to/source/ /path/to/destination/

例如,排除所有 .txt 文件:

rsync -av --exclude '*.txt' /path/to/source/ /path/to/destination/
6. 包含特定文件或目录

与排除相对的是 --include 选项,用于指定特定的文件或目录需要被同步。

rsync -av --include 'pattern' --exclude '*' /path/to/source/ /path/to/destination/

这里的命令只同步匹配 pattern 的文件,其他都排除。

7. 处理删除的文件

如果你希望目标目录完全镜像源目录,可以使用 --delete 选项。这会删除目标目录中源目录不存在的文件。

rsync -av --delete /path/to/source/ /path/to/destination/
8. 使用备份选项

--backup 选项会在删除或覆盖文件时,将旧文件备份到指定的目录。

rsync -av --backup --backup-dir=/path/to/backup /path/to/source/ /path/to/destination/

这会将任何被删除或覆盖的文件备份到指定的备份目录。

9. 硬链接支持

使用 -H 选项可以保持硬链接的结构。

rsync -avH /path/to/source/ /path/to/destination/

这非常有用于备份系统,因为它可以保存和复原硬链接的结构。

10. 进度和速度限制

如果你想看到每个文件的传输进度,可以添加 --progress 选项。此外,--bwlimit 选项可以限制 rsync 使用的带宽。

rsync -av --progress --bwlimit=1000 /path/to/source/ /path/to/destination/

这将显示进度并限制数据传输速度为1000KBytes/秒。

进阶技巧
  • 使用 SSH 密钥:为了安全和便利,建议配置无密码 SSH 登录,使用密钥进行身份验证。
  • 快照备份:可以结合 --link-dest 选项进行高效的增量备份,类似于快照,只备份变更的部分,同时链接到旧文件进行空间节省。
  • 大量文件处理:对于含有大量小文件的目录,使用 --inplace--whole-file 选项可以减少文件检查和比较的时间。

通过这些高级技巧和选项的运用,你可以让 rsync 成为一个非常强大和高效的同步和备份工具,无论是用于个人数据管理还是服务器级的数据保护。

11. 连接远程服务器的案例
1.使用 SSH 连接到远程服务器是最常见的 rsync 使用方式,因为它提供了加密的安全传输。
rsync -avz -e ssh /path/to/local/dir user@192.168.1.100:/path/to/remote/dir
-a 表示归档模式,保留文件属性和权限。
-v 表示详细模式,显示更多的信息。
-z 表示启用压缩。
-e ssh 指定使用 SSH 作为传输协议。

2.连接到 rsync 守护进程使用 "::" 符号
如果远程服务器运行的是 rsync 守护进程,可以直接通过 :: 连接到一个具体的模块。
rsync -av /path/to/local/dir user@192.168.1.100::module
在这个例子中:
user@192.168.1.100::module 指定了用户名、服务器地址和模块名。这种格式告诉 rsync 使用 rsync 守护进程(而不是 SSH)来传输数据。

3.当你想连接到一个通过特定端口运行的 rsync 守护进程时,可以使用 rsync URL 格式。
rsync -av rsync://user@192.168.1.100:873/module /path/to/local/dir
rsync:// 表示使用 rsync 协议。
:873 明确指定了 rsync 守护进程监听的端口(默认端口是 873,可以省略)。
/module 指定了目标服务器上的 rsync 模块。

4.如果你只是想查看远程 rsync 服务器上可用的模块,可以发送一个不带其他路径的请求:
rsync rsync://192.168.1.100/

5.如果你想从 rsync 守护进程托管的模块下载文件或目录到本地系统:
rsync -av 192.168.1.100::module/path/to/remote/file /path/to/local/dir

4.2 inotifywait

inotifywait 是一个利用 Linux 的 inotify 系统来监控文件系统事件的命令行工具。它能够等待指定的文件或目录发生特定事件,并执行相应的操作。下面是该工具的各个选项的详细解释:

常用选项解释
-h 或 --help: 显示帮助文本,列出所有可用的命令和选项。
@<file>: 指定不监控的文件。
--exclude <pattern>: 排除所有匹配扩展正则表达式 <pattern> 的文件的事件。如果有多个 --exclude,只有最后一个会被考虑。
--excludei <pattern>: 类似于 --exclude,但是不区分大小写。
--include <pattern>: 只包括匹配扩展正则表达式 <pattern> 的文件的事件,其他都排除。
--includei <pattern>: 类似于 --include,但是不区分大小写。
-m 或 --monitor: 持续监听事件,直到手动停止或 --timeout 到期。
-d 或 --daemon: 与 --monitor 类似,但在后台运行,并将事件记录到由 --outfile 指定的文件。这会隐含启用 --syslog。
-P 或 --no-dereference: 监控符号链接本身而不是链接指向的目标。
-r 或 --recursive: 递归监控目录。
--fromfile <file>: 从指定文件或标准输入 ('-') 读取要监控的文件列表。
-o--outfile <file>: 将事件输出到指定的文件而不是标准输出。
-s 或 --syslog: 将错误发送到系统日志而不是标准错误。
-q 或 --quiet: 减少输出信息,只输出事件。
-qq: 不输出任何信息,包括事件。
--format <fmt>: 使用指定的类似 printf 的格式字符串输出信息。
--no-newline: 在输出格式字符串后不打印换行符。
--timefmt <fmt>: 指定用于 --format 字符串中 %T 的时间格式字符串,兼容 strftime。
-c 或 --csv: 以 CSV 格式输出事件。
-t--timeout <seconds>: 设置超时时间,单位是秒。如果在指定时间内没有事件发生,则退出。如果时间为零,则永不超时。
-e--event <event>: 指定监听的事件类型。如果省略,则监听所有事件。

监听的事件类型
access: 文件或目录被读取。
modify: 文件或目录被写入。
attrib: 文件或目录的属性被修改。
close_write: 文件或目录在可写模式下被关闭。
close_nowrite: 文件或目录在只读模式下被关闭。
close: 文件或目录无论何种模式均被关闭。
open: 文件或目录被打开。
moved_to: 文件或目录被移入监控目录。
moved_from: 文件或目录被移出监控目录。
move: 文件或目录被移入或移出监控目录。
move_self: 被监控的文件或目录被移动。
create: 在监控目录内创建了新的文件或目录。
delete: 在监控目录内删除了文件或目录。
delete_self: 被监控的文件或目录被删除。
unmount: 包含文件或目录的文件系统被卸载。


--timefmt 选项在 inotifywait 命令中允许你自定义事件的时间格式,这个格式字符串是与 strftime 函数兼容的。strftime 是一个常用的时间格式化函数,它可以根据指定的格式模板将时间转换成相应的字符串。以下是一些常见的 strftime 格式化符号,这些都可以在 --timefmt 参数中使用:

%Y: 四位数的年份(例如:2021)
%y: 两位数的年份(例如:21)
%m: 月份(01-12)
%d: 一月中的第几天(01-31)
%H: 24小时制的小时(00-23)
%I: 12小时制的小时(01-12)
%M: 分钟(00-59)
%S: 秒(00-59)
%p: 上午或下午标识(AM 或 PM)
%a: 星期几的简写(例如:Mon,Tue)
%A: 星期几的全称(例如:Monday,Tuesday)
%b: 月份的简写(例如:Jan,Feb)
%B: 月份的全称(例如:January,February)
%c: 本地日期和时间表示法
%x: 本地日期表示法
%X: 本地时间表示法
%Z: 时区名称
%z: 时区名称的数值表示(例如:+0800)
假设你想要以年-月-日 时:分:秒的格式来记录文件系统事件的时间,你可以这样设置 --timefmt 和 --format:
inotifywait -m -e modify --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' /path/to/directory


--format有关的格式占位符:
格式占位符
%w: 事件发生的路径。
%f: 触发事件的文件名。
%e: 发生的事件列表。
%T: 触发事件的时间(需要和 --timefmt 选项一起使用,以自定义时间的格式)。
%X: 与事件相关的文件系统类型(需要 Linux 内核支持)。
%W: 监控项的看守标记(watch descriptor),即 inotify 内部使用的唯一标识。

当然,我们可以简化一些常见的 inotifywait 使用案例,让你可以快速上手,通过几个简单的命令行例子来理解其基本用法。

1. 监控单个文件的修改

如果你只想监控一个特定文件的修改,可以使用下面的命令:

inotifywait -m -e modify /path/to/your/file.txt

这个命令会实时显示所有对 file.txt 文件的修改事件。

2. 监控一个目录下的创建和删除事件

假设你想监控一个目录,查看其中文件何时被创建或删除:

inotifywait -m -e create -e delete /path/to/your/directory/

此命令会监控指定目录中文件的创建和删除事件,并持续输出这些事件的信息。

3. 监控目录及其子目录的所有事件

如果你需要监控一个目录及其所有子目录中发生的所有类型的事件,可以使用如下命令:

inotifywait -m -r /path/to/your/directory/

-r 选项使得监控递归到所有子目录,而 -m 使命令持续运行,不断监控新的事件。

4. 监控多个文件或目录

你可以同时监控多个文件或目录,只需要在命令中列出所有你想监控的路径:

inotifywait -m /path/to/first/file /path/to/second/directory

这个命令会监控两个路径上的所有默认事件,并实时报告它们。

inotifywait 是一个非常有用的工具,可以监控文件系统的变化并执行相应的响应动作。下面将介绍几个常见的 inotifywait 使用案例,展示其在实际应用中的具体用法。

5. 监控目录并自动同步到远程服务器

假设你有一个本地目录,希望一旦里面的文件有变动就自动同步到远程服务器。这可以通过结合 inotifywaitrsync 来实现。

#!/bin/bash

SOURCE_DIR="/path/to/local/dir"
DEST_DIR="user@remotehost:/path/to/remote/dir"
LOG_FILE="/path/to/log/file.log"

inotifywait -m -r -e modify -e create -e delete "$SOURCE_DIR" --format '%w%f' |
while read file; do
    echo "$(date) Changes detected in $file" >> "$LOG_FILE"
    rsync -avz -e ssh "$SOURCE_DIR" "$DEST_DIR"
done

这个脚本会监控 SOURCE_DIR 目录的修改、创建和删除事件,并将变化记录到日志文件中。每当检测到变化时,使用 rsync 将目录同步到远程服务器。

6. 监控日志文件并发送警报

如果你想监控一个日志文件,并在出现特定文本(比如错误)时发送警报,可以使用 inotifywait 来实现。

#!/bin/bash

LOG_FILE="/path/to/log/file.log"
ALERT_KEYWORD="ERROR"

inotifywait -m -e modify "$LOG_FILE" --format '%w%f' |
while read file; do
    if grep -q "$ALERT_KEYWORD" "$file"; then
        echo "Error found in log file! Alerting the user."
        # 发送邮件或其他通知
    fi
done

这个脚本会实时监控 LOG_FILE 文件的修改事件。一旦文件被修改,脚本会检查是否存在关键字 ERROR,如果存在,则执行警报通知的操作。

7. 自动处理上传的文件

如果有一个用于上传文件的目录,你希望自动对上传的文件进行处理,如自动解压缩或转换格式,可以使用 inotifywait

#!/bin/bash

UPLOAD_DIR="/path/to/upload/dir"

inotifywait -m -e create -r "$UPLOAD_DIR" --format '%w%f' |
while read file; do
    echo "New file uploaded: $file"
    # 假设需要对上传的.zip文件进行解压缩
    if [[ "$file" =~ \.zip$ ]]; then
        unzip -o "$file" -d "${file%.zip}/"
        echo "File unzipped: ${file%.zip}/"
    fi
done

这个脚本会监控 UPLOAD_DIR 目录中新上传的文件。一旦有新文件创建,脚本会检查文件类型并执行相应的操作,例如如果文件是 ZIP 格式,则自动解压缩。

4.3 inotifywatch

inotifywatch 是一个用来收集文件系统使用情况统计数据的工具,基于 inotify 机制。以下是对其命令行选项的详细解释:

基本选项
  • -h--help: 显示帮助文本,列出所有可用的命令和选项。
  • -v--verbose: 输出更多的信息,帮助了解命令的执行细节。
文件选择与排除
  • @<file>: 指定不被监控的文件。
  • --fromfile <file>: 从文件或标准输入 ('-') 读取需要监控的文件列表。
  • --exclude <pattern>: 排除所有与提供的扩展正则表达式 <pattern> 匹配的文件的事件。
  • --excludei <pattern>: 类似于 --exclude,但匹配时不考虑大小写。
  • --include <pattern>: 只包括与提供的扩展正则表达式 <pattern> 匹配的文件的事件,其他都排除。
  • --includei <pattern>: 类似于 --include,但匹配时不考虑大小写。
监控和输出选项
  • -z--zero: 在最终的统计表中,即使某些行或列的计数为零也显示它们(默认情况下不显示全零的行或列)。
  • -r--recursive: 递归地监控指定的目录及其子目录。
  • -P--no-dereference: 监控符号链接本身,而不是它们指向的文件。
时间和事件控制
  • -t--timeout <seconds>: 设置监控的时间长度,单位是秒。如果省略或设置为零,则 inotifywatch 会一直运行,直到接收到中断信号。
  • -e--event <event>: 监听特定的事件类型。如果省略,则监听所有事件类型。
排序选项
  • -a--ascending <event>: 按照特定事件的发生次数升序排序,或按总次数排序。
  • -d--descending <event>: 按照特定事件的发生次数降序排序,或按总次数排序。
退出状态
  • 0: 正常退出。
  • 1: 发生了某些错误。
监听的事件类型

事件类型与 inotifywait 类似,包括:

  • access: 文件或目录内容被读取。
  • modify: 文件或目录内容被修改。
  • attrib: 文件或目录属性发生变化。
  • close_write: 文件或目录在可写模式下关闭。
  • close_nowrite: 文件或目录在只读模式下关闭。
  • close: 文件或目录关闭,不论其模式。
  • open: 文件或目录被打开。
  • moved_to: 文件或目录被移动到监控目录中。
  • moved_from: 文件或目录被从监控目录中移出。
  • move: 文件或目录移入或移出监控目录。
  • move_self: 被监控的文件或目录自身被移动。
  • create: 在监控目录中创建文件或目录。
  • delete: 在监控目录中删除文件或目录。
  • delete_self: 被监控的文件或目录被删除。
  • unmount: 包含文件或目录的文件系统被卸载。

inotifywatch 通过这些选项为用户提供灵活的文件系统监控工具,可以用来收集关于文件或目录活动的详细统计数据,这对于了解文件系统的使用模式非常有用。

inotifywatch 是一个用来监控文件系统事件并统计这些事件发生的次数的工具。它适合用来分析文件系统的使用模式或检测特定目录和文件的活动。下面我将提供一些实际的使用案例:

案例 1: 统计一个目录中文件事件的发生频率

如果你想了解一个特定目录(比如一个服务器上的上传目录)中的文件活动情况,可以使用以下命令:

inotifywatch -v -t 3600 -r /path/to/directory

这个命令将递归地监控 /path/to/directory 目录中的所有文件和子目录,持续一个小时(3600秒)。监控结束后,它会显示每种事件的总计次数,这可以帮助你理解该目录在一个小时内的活动模式。

案例 2: 监控多个文件的访问和修改事件

如果你有几个关键文件,需要监控这些文件何时被访问或修改,可以这样做:

inotifywatch -e access -e modify -t 7200 /path/to/file1 /path/to/file2

这个命令监控指定的两个文件,只记录访问和修改事件,持续两小时。这对于调试或安全监控非常有用,比如监控配置文件或重要的数据文件。

案例 3: 监控并记录文件系统活动到日志文件

如果你想将监控到的文件系统活动记录到一个日志文件中,以便后续分析,可以使用以下命令结合 cron 任务来实现:

inotifywatch -r -t 86400 /path/to/watched/directory > /path/to/logfile.log

这个命令会递归监控一个目录一整天(86400秒),然后将结果重定向到一个日志文件中。你可以设置一个每日运行的 cron 任务,每天生成一个新的日志文件。

案例 4: 按事件排序并输出详细信息

如果你对哪些事件最频繁感兴趣,并希望得到详细的输出,可以使用排序选项:

inotifywatch -v -t 3600 -r --descending access /path/to/directory

这个命令将监控指定目录及其子目录,持续一个小时,并按访问事件的发生次数降序排序输出结果。这对于分析最频繁访问的文件非常有帮助。

以用来收集关于文件或目录活动的详细统计数据,这对于了解文件系统的使用模式非常有用。

inotifywatch 是一个用来监控文件系统事件并统计这些事件发生的次数的工具。它适合用来分析文件系统的使用模式或检测特定目录和文件的活动。下面我将提供一些实际的使用案例:

案例 1: 统计一个目录中文件事件的发生频率

如果你想了解一个特定目录(比如一个服务器上的上传目录)中的文件活动情况,可以使用以下命令:

inotifywatch -v -t 3600 -r /path/to/directory

这个命令将递归地监控 /path/to/directory 目录中的所有文件和子目录,持续一个小时(3600秒)。监控结束后,它会显示每种事件的总计次数,这可以帮助你理解该目录在一个小时内的活动模式。

案例 2: 监控多个文件的访问和修改事件

如果你有几个关键文件,需要监控这些文件何时被访问或修改,可以这样做:

inotifywatch -e access -e modify -t 7200 /path/to/file1 /path/to/file2

这个命令监控指定的两个文件,只记录访问和修改事件,持续两小时。这对于调试或安全监控非常有用,比如监控配置文件或重要的数据文件。

案例 3: 监控并记录文件系统活动到日志文件

如果你想将监控到的文件系统活动记录到一个日志文件中,以便后续分析,可以使用以下命令结合 cron 任务来实现:

inotifywatch -r -t 86400 /path/to/watched/directory > /path/to/logfile.log

这个命令会递归监控一个目录一整天(86400秒),然后将结果重定向到一个日志文件中。你可以设置一个每日运行的 cron 任务,每天生成一个新的日志文件。

案例 4: 按事件排序并输出详细信息

如果你对哪些事件最频繁感兴趣,并希望得到详细的输出,可以使用排序选项:

inotifywatch -v -t 3600 -r --descending access /path/to/directory

这个命令将监控指定目录及其子目录,持续一个小时,并按访问事件的发生次数降序排序输出结果。这对于分析最频繁访问的文件非常有帮助。

这些案例展示了 inotifywatch 在不同场景中的应用,从基本的文件监控到复杂的数据收集和分析,都是该工具的强项。

  • 24
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XingYuyu_Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值