当前位置: 首页 > article >正文

rdiff-backup备份

目录

1. 服务器备份知识点

1.1 备份策略

1.2 备份步骤和宝塔面板简介

1.3 CentOS7重要目录

2. 备份工具

2.1 tar -g

备份演示

2. rsync

备份演示

3. rdiff-backup

备份演示

4. 差异和优缺点

3. rdiff-backup安装和使用

3.1 备份命令rdiff-backup

3.2 恢复命令--restore-as-of

3.3 删除命令--remove-older-than

3.4 备份目录选择

3.5 手动备份home目录演示

第一次备份

第二次备份

第三次备份

恢复到第二次备份数据

3.6 自动化备份脚本

第一次备份

第二次备份

测试多目录备份脚本

测试Linux定时任务

1. 宝塔面板

backEnd2

2. Linux定时任务命令

2.1 系统配置文件

2.2 用户的配置文件

3 crontab -e

3.1 定时测试:

3.2 每分钟测试

3.3 定时任务注意事项

3.4 实际测试

3.5 测试睡眠时产生多个文件

3.6 最终备份脚本

监控Linux目录差异

最终测试

最终监控脚本

本篇完。


1. 服务器备份知识点

1.1 备份策略

  • 3份备份 除了原有的数据备份副本之外,应该始终保证有两个额外的备份副本或版本。假设一份备份被损坏的的机率为1/100,那么三份备份遭到损坏的机率便仅为1/1000000,意味着在原本的备份基础上多添加两份保障。
  • 2种介质至少在两种不同的存储介质上存储数据副本,包括内部驱动器,以及外部媒介,如磁盘、磁带、闪存、网络存储或云存储等。将备份存放在不同的介质中,为的就是降低单一介质遭遇损坏的风险。
  • 1份异地将至少一份备份数据存储在异地作为异地副本,备份数据之间的隔离十分重要,将外部存储设备与生产存储设备存放在同一空间的行为并不明智,一旦遭遇洪水火灾等自然灾害时,数据就可能会有”团灭”的危机。

Linux备份通常可以分为以下几个层次,这些层次主要基于备份的广度和深度来划分:

  1. 完全备份(Full Backup)
    • 完全备份是指将所有需要备份的数据全部进行备份。这种备份方式会备份整块硬盘、整个分区或某个具体的目录中的所有数据。
    • 完全备份的优点是恢复时简单快捷,因为所有需要的数据都已经包含在备份文件中。
    • 缺点是备份所需的时间和存储空间较大,特别是当数据量很大时。
  2. 增量备份(Incremental Backup)
    • 增量备份是在完全备份的基础上,只备份自上一次备份(无论是完全备份还是增量备份)以来发生了更改的数据。
    • 增量备份的优点是备份所需的时间和存储空间较小,因为它只备份新增或修改的数据。
    • 缺点是恢复时可能需要多个备份文件(包括完全备份和多个增量备份),恢复过程相对复杂。
  3. 差异备份(Differential Backup)
    • 差异备份与增量备份类似,但它是基于上一次完全备份来备份之后所有发生更改的数据。即每次差异备份都会备份自上一次完全备份以来所有新增或修改的数据。
    • 差异备份的优点是恢复时相对增量备份简单,因为它只需要一个完全备份和一个最新的差异备份文件。
    • 缺点是随着时间的推移,差异备份文件可能会变得很大,因为它包含了自上次完全备份以来的所有更改。

        对于数据变化不大的系统,可以选择完全备份和定期的差异备份;而对于数据变化频繁的系统,则可以选择完全备份和频繁的增量备份。

        普通的备份策略比如:(一周一次全量备份,一天一次增量备份,全量备份可以用宝塔定时备份保存三份文件,自己备份也可以。)


1.2 备份步骤和宝塔面板简介

一般备份步骤:

1. 数据识别与分类

  • 识别重要数据:首先,需要明确哪些数据是业务关键或法律要求必须保留的。
  • 数据分类:根据数据的敏感性、重要性和恢复时间目标(RTO)进行分类,以便制定合适的备份策略。

2. 备份策略制定

  • 全备份与增量/差异备份:定期执行全备份,并在全备份之间执行增量或差异备份以减少存储需求和备份时间。
  • 备份频率:根据数据变化频率和业务需求确定备份的频率。
  • 备份保留周期:设定备份数据的保留时间,以满足合规性和历史记录需求。

3. 备份介质与存储

  • 本地备份:使用硬盘、磁带或NAS/SAN等本地存储设备进行备份。
  • 云备份:利用云服务提供商的存储服务进行远程备份,提供更高的数据可用性和灾难恢复能力。
  • 混合备份:结合本地和云备份的优势,实现灵活的数据保护和恢复策略。

4. 系统配置备份

  • 操作系统配置:备份操作系统的配置文件、注册表(Windows)或系统文件(Linux)。
  • 应用程序配置:备份所有关键应用程序的配置文件、数据库连接字符串等。
  • 网络配置:备份路由器、交换机、防火墙等网络设备的配置。
  • 虚拟化环境配置:备份虚拟机模板、快照和虚拟机管理器的配置文件。

5. 备份验证与测试

  • 备份验证:定期验证备份数据的完整性和可恢复性,确保备份过程没有错误。
  • 灾难恢复演练:定期进行灾难恢复演练,测试备份数据的恢复流程和时间,确保在真实灾难发生时能够迅速恢复业务。

6. 安全与合规性

  • 加密备份数据:对备份数据进行加密,防止数据在传输和存储过程中被未经授权访问。
  • 访问控制:对备份存储设备和备份过程实施严格的访问控制,确保只有授权人员能够访问备份数据。
  • 合规性:确保备份策略符合行业法规和标准,如GDPR、HIPAA等。

7. 自动化与监控

  • 自动化备份:使用自动化工具或脚本来执行备份任务,减少人为错误并提高备份效率。
  • 监控与报警:实时监控备份过程和备份存储设备的状态,设置报警机制以便在出现问题时及时响应。

宝塔面板有上部分的大部分功能,快照的话,环境也会备份。


1.3 CentOS7重要目录

在CentOS 7的备份过程中,根目录(/)下的目录哪些需要被备份,主要取决于系统的具体使用情况和数据的重要性。以下是一些通常需要备份的关键目录:

  1. /etc
    • 这个目录包含了系统的配置文件,包括网络配置(如/etc/sysconfig/network-scripts/)、SSH配置(/etc/ssh/)、防火墙和SELinux配置(/etc/firewalld//etc/selinux/)、主机名和主机文件(/etc/hostname/etc/hosts)等。这些配置文件对于系统的正常运行至关重要,因此在备份时必须包含。
  2. /home
    • 用户的主目录通常位于此目录下,每个用户都有一个以其用户名命名的目录,其中包含用户的个人文件、配置、下载等。这些目录对于保留用户数据至关重要,因此在备份时必须包括。
  3. /root
    • 如果root用户经常用于执行重要任务或存储关键文件,那么/root目录也应该被备份。这个目录包含了root用户的主目录和可能存储在其中的配置文件或重要数据。
  4. /var/log
    • 日志文件对于系统的故障排查和历史记录非常有用。如果需要保存系统的历史记录或用于后续的审计,那么/var/log目录也应该被备份。
  5. 数据库目录
    • 如果系统上运行有数据库服务(如MySQL、PostgreSQL等),那么数据库的数据目录和配置文件也需要被备份。具体的数据目录位置取决于数据库的配置,但通常可以在数据库的配置文件中找到(如MySQL的/etc/my.cnf)。
  6. /usr/local(或特定应用安装目录):
    • 如果在/usr/local或系统的其他非标准位置安装了第三方软件或应用,那么这些目录也应该被备份。这包括应用程序的可执行文件、库文件、配置文件和数据文件。
  7. 其他重要目录
    • 根据系统的具体使用情况,可能还有其他重要目录需要被备份,如/var/spool/mail(系统邮件目录)、/var/spool/cron(计划任务目录)等。

        需要注意的是,在备份过程中,一些目录可能会被排除在外,因为它们包含了临时文件或系统运行时所需的动态生成的文件。例如,/proc/sys/tmp等目录通常不需要备份,因为它们在系统重启后会被重新生成或清空。

        此外,对于整个系统的备份,可以使用tar命令或dd命令等工具来实现。tar命令可以用于打包和压缩特定的目录和文件,而dd命令则可以用于备份整个硬盘或分区。在选择备份方法时,应根据系统的具体需求和数据的重要性来决定。

        最后,备份完成后,应将备份文件存储在安全可靠的位置,如外部硬盘、云存储或远程服务器,以确保在数据丢失或系统故障时能够迅速恢复。

        关机原因那个应该就是尝试重启到16700次,但是没有重启成功,同时slurmd还在运行,当时说下载东西,刚才查了一下有这种重启很多次就会影响性能,然后性能不好的同时下载很多东西可能服务器就断了,推测是这样。

        fVjWeDNS.service网上搜不到,冠凌那边看他们的回复应该也不知道这个服务是干嘛的,我觉得可以先把尝试启动/bin/rRUBHDfR的那一行注释掉,因为也找不到这个文件夹,一直尝试执行也是个问题。

        在Linux系统中,目录结构遵循一套标准规范,不同的目录用于存放不同类型的文件和数据。以下是您提到的目录的详细解释以及是否需要备份的建议:

目录解释

        在Linux系统中,目录结构遵循一套标准规范,不同的目录用于存放不同类型的文件和数据。以下是您提到的目录的详细解释以及是否需要备份的建议:

  1. bin: 存放基本的用户命令(如ls, cp, mv等),通常是系统启动时需要的基本命令。
    备份建议: 建议备份,因为它包含基本的系统命令。

  2. dev: 包含设备文件,这些文件表示系统中的设备(如硬盘、终端等)。
    备份建议: 通常不需要备份,因为这些文件在系统重启时会自动生成。

  3. home: 存放用户的个人文件和设置,每个用户在此目录下有一个子目录。
    备份建议: 强烈建议备份,因为它包含用户的个人数据和配置。

  4. lib: 包含系统和应用程序所需的共享库文件(动态链接库)。
    备份建议: 建议备份,因为某些应用程序和系统命令依赖于这些库。

  5. lib64: 64位系统的共享库目录,类似于lib,但专门用于64位库。
    备份建议: 建议备份,尤其在64位系统上。

  6. mnt: 通常为空,作为临时挂载文件系统的挂载点。
    备份建议: 通常不需要备份。

  7. proc: 虚拟文件系统,提供关于系统和进程的信息。
    备份建议: 不需要备份,因为这些文件是动态生成的。

  8. rpm: 用于存放RPM包的目录,可能包含软件包的管理信息。
    备份建议: 如果有特殊的软件包或信息,可以考虑备份。

  9. sbin: 存放系统管理员使用的命令(如shutdown, ifconfig等)。
    备份建议: 建议备份,因为这些命令通常需要在系统维护时使用。

  10. srv: 存放服务相关的数据,如HTTP服务器、FTP服务器的数据等。
    备份建议: 根据服务的需要,建议备份。

  11. tmp: 存放临时文件,系统和用户都可以使用,通常在重启后清空。
    备份建议: 不需要备份,因为其内容是临时的。

  12. var: 存放可变数据文件,如日志文件、邮件队列、数据库文件等。
    备份建议: 强烈建议备份,因为它包含系统运行中的重要数据。

  13. boot: 包含启动加载器和内核文件,系统启动所需的文件。
    备份建议: 建议备份,特别是在系统重装或恢复时。

  14. etc: 存放系统配置文件和目录(如网络设置、用户账户等)。
    备份建议: 强烈建议备份,因为这些配置对于系统的正常运行至关重要。

  15. media: 通常用于挂载可移动媒体(如USB驱动器、CD-ROM等)。
    备份建议: 根据需要,备份可移动媒体中的数据。

  16. opt: 存放附加的第三方应用程序。
    备份建议: 根据具体安装的应用程序,建议备份。

  17. root: 超级用户的家目录。
    备份建议: 建议备份,因为可能包含重要的配置和数据。

  18. run: 包含当前运行时信息(如PID文件)。
    备份建议: 不需要备份,因为其内容是动态的。

  19. slurm: 如果系统使用SLURM作为作业调度程序,通常包含相关的文件和信息。
    备份建议: 根据使用情况,可能需要备份。

  20. sys: 提供系统信息,通常是虚拟文件系统。
    备份建议: 不需要备份,因为其内容是动态的。

  21. usr: 包含用户程序和共享数据,通常分为bin, lib, sbin, share等子目录。
    备份建议: 建议备份,因为包含很多用户级别的应用程序。

  22. www: 通常是Web服务器的根目录。
    备份建议: 强烈建议备份,尤其是Web内容。

总结

  • 强烈建议备份的目录homevaretcusrbootwww
  • 建议备份的目录binliblib64sbinsrvoptrootrpm
  • 通常不需要备份的目录devmntproctmprunsys

要加的目录:

  1. bin: 存放基本的用户命令(如ls, cp, mv等),通常是系统启动时需要的基本命令。
    备份建议: 建议备份,因为它包含基本的系统命令。

  2. lib: 包含系统和应用程序所需的共享库文件(动态链接库)。
    备份建议: 建议备份,因为某些应用程序和系统命令依赖于这些库。

  3. lib64: 64位系统的共享库目录,类似于lib,但专门用于64位库。
    备份建议: 建议备份,尤其在64位系统上。

  4. sbin: 存放系统管理员使用的命令(如shutdown, ifconfig等)。
    备份建议: 建议备份,因为这些命令通常需要在系统维护时使用。

  5. srv: 存放服务相关的数据,如HTTP服务器、FTP服务器的数据等。
    备份建议: 根据服务的需要,建议备份。

  6. var: 存放可变数据文件,如日志文件、邮件队列、数据库文件等。
    备份建议: 强烈建议备份,因为它包含系统运行中的重要数据。

  7. boot: 包含启动加载器和内核文件,系统启动所需的文件。
    备份建议: 建议备份,特别是在系统重装或恢复时。

  8. etc: 存放系统配置文件和目录(如网络设置、用户账户等)。
    备份建议: 强烈建议备份,因为这些配置对于系统的正常运行至关重要。

  9. root: 超级用户的家目录。
    备份建议: 建议备份,因为可能包含重要的配置和数据。

  10. slurm: 如果系统使用SLURM作为作业调度程序,通常包含相关的文件和信息。
    备份建议: 根据使用情况,可能需要备份。

  11. usr: 包含用户程序和共享数据,通常分为bin, lib, sbin, share等子目录。
    备份建议: 建议备份,因为包含很多用户级别的应用程序。

  12. www: 通常是Web服务器的根目录。
    备份建议: 强烈建议备份,尤其是Web内容。

  13. run: 包含当前运行时信息(如PID文件)。
    备份建议: 不需要备份,因为其内容是动态的。


2. 备份工具

2.1 tar -g


备份演示

全备份:

在oxTest目录增加文件后增量备份:

恢复数据到 /home/rtx/oxTest2 :

恢复增量备份:

查看增量备份:


2. rsync

(加 --diff 选项可以实现同步删除文件,类似差异备份,否则只能增量备份)

rsync 是一个在 Linux 和 Unix 系统中广泛使用的文件传输和同步工具。它可以在本地和远程之间高效地复制和同步文件和目录,同时尽量减少数据传输量,因为它只传输差异部分(即已更改的部分)。rsync 非常适合用于备份和镜像,以及作为高效的文件传输工具。

基本语法

rsync [选项] 源路径 目标路径

常用选项

  • -a 或 --archive:归档模式,表示以递归方式传输文件,并保持所有文件属性,等同于 -rlptgoD
  • -v 或 --verbose:详细模式,输出更多信息。
  • -z 或 --compress:在传输时压缩数据。
  • -r 或 --recursive:递归复制目录树。
  • -l 或 --links:复制符号链接作为符号链接。
  • -p 或 --perms:保持文件权限。
  • -t 或 --times:保持文件时间戳。
  • -g 或 --group:保持文件组信息。
  • -o 或 --owner:保持文件所有者信息(超级用户才能使用)。
  • -D 或 --devices:保持设备文件信息(超级用户才能使用)。
  • --delete:删除目标目录中源目录中没有的文件(使两边内容一致)。
  • --progress:显示传输进度。
  • -e:指定远程 shell,用于通过 SSH 传输文件(如 -e "ssh -p 2222")。
  • --contimeout=N:设置连接超时时间,单位为秒。

示例

  1. 本地目录同步

    rsync -avz /source/directory/ /destination/directory/

    这个命令会将 /source/directory/ 目录下的所有内容(包括子目录和文件)同步到 /destination/directory/,同时保持文件属性、压缩数据,并显示详细过程。

  2. 通过 SSH 远程同步

    rsync -avz -e "ssh -p 2222" /local/directory/ user@remotehost:/remote/directory/

    这个命令会将本地的 /local/directory/ 目录通过 SSH(假设 SSH 端口为 2222)同步到远程主机 remotehost 的 /remote/directory/ 目录下。

  3. 删除目标目录中不存在的文件

    rsync -avz --delete /source/directory/ /destination/directory/

    这个命令除了同步文件外,还会删除 /destination/directory/ 中那些在 /source/directory/ 中不存在的文件,使两边内容完全一致。


备份演示

第一次全备份:

添加一个文件后增量备份:

无法把增量备份中增量的数据单独做成一个文件:

rsync是传输和同步文件,目的文件没有压缩。


3. rdiff-backup

        在Linux的CentOS 7中,差异备份工具的一个常用选项是rdiff-backup。rdiff-backup工具特别适用于累积差异备份,通过它,用户可以仅备份自上次完整备份或差异备份以来发生变化的数据,从而节省存储空间并提高效率。(在公司用rdiff-backup备份的话,像home目录和其它重要目录,可以每天备份一次,然后其他数据库的数据可以两天备份一次,环境之类的不太懂在哪个文件,然后会修改的其他文件就可以一周备份一次,都保留两份)

rdiff-backup  ==> 用于累积差异备份,加上自己写的shell script,每日备份,效果更佳

        先用yum search rdiff-backup看看是否yum源含有rdiff-backup这个package,若没有的话请yum install epel-release

接下来yum install rdiff-backup

用法用man来查一下吧,直接贴一份脚本:

(方括号相当于两个小括号,用来判断真假)

脚本文件下载地址: 百盘 密码: 9af9

然后设定每日定时进行差异备份

我设定为每日晚上10点自动进行差异备份

下面,查看一下服务器备份的情况

可以通过时间来还原该目录下的某个文件或者该整个目录,还原方法如下:

(以下皆为演示需要才新建backuptest文件夹,若真正需要还原的时候可以直接指定到目标文件夹进行覆盖 比如: rdiff-backup -r now /backup/etc.dir /etc  实验的时候最好不要这样用)

1.按时间还原整个目录

还原只会按指定时间之前最近的一次备份进行还原,比如上面我写now,那么它会找到在当前时间之前最近的一次备份进行还原,也就是还原到上2图中的Current mirror: Tue Dec 12 22:00:01 2017这个时间

可以看到,还原后,该文件夹的时间确实是那个时间点之前的时间,说明该目录最后一次修改是在20:49:13这个时间,

若要单独还原某文件到某个时间点可以进行如下操作:

首先通过man rdiff-backup来查看下还原部分介绍RESTORING开头的部分

        该部分内容介绍了,凡是以.diff,.snapshot,.dir,.gz(被gzip压缩后)皆可进行还原,而.missing表示文件在该时间点后已经不存在

        rdiff-backup-data文件夹下放的是差异文件,这些都是整个目录的差异备份文件(可以直接使用该文件还原到某个时间点)

        而rdiff-backup-data目录内的increments记录的是etc这个文件夹下文件的差异备份文件(可以使用该文件进行还原etc目录下的某个文件到某个时间点)

下面举例还原/etc/resolve.conf这个文件,首先查看下差异备份文件:

还原时间为2017-12-11 22:45:06,查看下我们本地文件

本地文件时间为2017-12-12 20:49:13,因此现在将该文件还原到上述差异备份文件所在的时间点

        以上便成功将文件还原到了2017-12-11 22:45:06那个时候的状态,你可能会奇怪,为什么文件的日期却是2017-12-10 11:15:28?这是因为我们的rdiff-backup程序只会记录备份时间,而不会修改文件的任何属性,这说明在2017-12-11 22:45:06这个时间的时候,文件的modification time(-mtime)便是2017-12-10 11:15:28


备份演示

差异备份(增和减):


4. 差异和优缺点

在CentOS 7的备份策略中,tarrsyncrdiff-backup是三种常用的工具,它们各自适用于不同的场景,并具有不同的优缺点。

1. tar -g

适用情况

  • 全系统或目录备份:tar命令非常适合用于整个系统或指定目录的备份。它可以保留文件权限、所有者和其他属性,非常适合在灾难恢复时重建系统或目录结构。

优点

  • 灵活性高:可以指定任意目录进行备份,也可以包含或排除特定文件。
  • 保留文件属性:备份时保留文件的权限、时间戳等属性。
  • 支持多种压缩格式:如gzip、bzip2等,可以有效减少备份文件的大小。

缺点

  • 恢复时需要额外操作:恢复时可能需要手动重新创建被排除的目录(如/proc、/sys等)。
  • 备份时间较长:对于大型目录或系统,备份过程可能需要较长时间。

2. rsync

适用情况

  • 远程和本地同步:rsync非常适合在本地和远程系统之间同步文件和目录。它支持增量备份,只传输更改过的部分,从而节省时间和带宽。

优点

  • 增量备份:只备份自上次备份以来更改过的数据,减少备份时间和存储空间。
  • 保持文件属性:保留原始文件的权限、时间戳、软硬链接等。
  • 压缩传输:在传输过程中可以压缩数据,减少带宽使用。
  • 安全性:可以通过SSH等安全协议传输数据。

缺点

  • 恢复功能有限:rsync本身不直接提供恢复功能,通常需要与其他工具结合使用。
  • 依赖外部连接:在远程备份时,依赖稳定的网络连接。

3. rdiff-backup

适用情况

  • 高效增量备份:rdiff-backup结合了增量备份和镜像备份的优点,非常适合需要频繁备份且数据量大的场景。

优点

  • 高效性:通过增量备份和数据压缩技术,显著提高备份效率,减少存储空间的占用。
  • 灵活性:支持本地和远程备份,用户可以根据需要选择合适的备份方式。
  • 安全性:使用SSH进行数据传输,确保备份数据的安全性。
  • 恢复功能强大:支持按时间点恢复文件或整个目录,用户可以恢复到任意一个历史备份点。

缺点

  • 学习曲线:对于初学者来说,可能需要一定时间来熟悉其命令和选项。
  • 依赖外部工具:在Windows等非Linux系统上使用时,可能需要借助其他工具(如Cygwin)来运行。


3. rdiff-backup安装和使用

        在Linux的CentOS 7中,差异备份工具的一个常用选项是rdiff-backup。rdiff-backup工具特别适用于累积差异备份,通过它,用户可以仅备份自上次完整备份或差异备份以来发生变化的数据,从而节省存储空间并提高效率。rdiff-backup不能备份非目录,文件可以新建一个目录放进去。

        在CentOS或RHEL系统上,可以使用yum包管理器来安装rdiff-backup:

sudo yum install epel-release
sudo yum install rdiff-backup

3.1 备份命令rdiff-backup

使用 rdiff-backup 命令将 example 目录备份到 example-backup 目录:

rdiff-backup example example-backup

第二次备份操作,rdiff-backup 会自动进行增量备份:

使用 --list-increments 选项列出所有备份信息:

rdiff-backup --list-increments example-backup

或者使用 --list-increment-sizes 以表格形式列出备份大小:

rdiff-backup --list-increment-sizes example-backup


3.2 恢复命令--restore-as-of

        执行备份命令到新目录时,新目录下会生成一个rdiff-back-data的目录,里面有很多文件,命名为同一时间的就可以用rdiff-backup --restore-as-of恢复到当时备份的时间。

用 --restore-as-of 选项指定要恢复的时间点。例如,恢复到某个具体时间:

rdiff-backup --restore-as-of 'Sun Sep 8 11:42:30 2024' example-backup example-restore

或者恢复到最新备份:

rdiff-backup --restore-as-of now example-backup example-restore

如果目标目录已存在,可以使用 --force 选项强制覆盖:

rdiff-backup --restore-as-of now --force example-backup example

3.3 删除命令--remove-older-than

为了节省存储空间,可以删除旧的备份文件。以下是删除旧备份的基本步骤:

使用 --remove-older-than 选项删除指定时间之前的备份。例如,删除一天前的备份:

rdiff-backup --remove-older-than 1D example-backup

如果需要删除多个备份,可以使用 --force 选项:

rdiff-backup --remove-older-than 1D --force example-backup

man查看--remove-older-than详细信息:

s,m,h,D,W,M,Y,分别代表秒,分,时,天,周,月,年

回来演示删除一天前的备份:

目前来看rdiff-backup-data里有差异备份的才会删除,否则不会删除


3.4 备份目录选择

公司服务器磁盘:


现在可以暂时备份home目录和root目录和etc目录和www目录,分别备份到两个back目录里。


3.5 手动备份home目录演示

rdiff-backup --include /dir1/important_files dir1 dir2

第一次备份

把/home目录的所有内容备份到一个新建的目录:/homeBack

除了原有的数据还多了一份rdiff-backup-data目录,新备份homeBack里的可执行文件也可执行


第二次备份

进入原home目录里增加一个文件和删除一个文件后,进行第二次备份

目标目录的rdiff-backup-data里自动增加了多份新文件


第三次备份

类似第二份备份的操作,在原home目录修改一些文件后再进行第三次备份:

目标目录的rdiff-backup-data里也自动新增一系列第三次备份的相关文件:


恢复到第二次备份数据

rdiff-backup-data生成了一份恢复日志,里面的其它内容没有变化

进入原home目录后发现确实恢复到了第二份备份的数据(无TestAdd2.txt,Test目录没修改成TestDiff)。


3.6 自动化备份脚本

rdiff-backup备份脚本:

#!/bin/bash  
sour_dirs="/home/back1" # 设置要备份的目录列表
dest_dirs="/home/back2" # 设置备份目标目录(远程或本地)
log_file="/home/back2/back.log" # 设置备份日志文件的路径 
date=$(date +'%y%m%d %H:%M:%S') #备份的日期

[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目标目录不存在就创建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就创建
echo "===========================${date}=======================" >>$log_file  
for s_dir in $sour_dirs
do  
    d_dir=$dest_dirs${s_dir}.dir
    [ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就创建
    rdiff-backup $s_dir $d_dir #将源文件分别备份为 源文件名.dir
    if [ $? == 0 ]; then   #如果上一个命令没出问题就继续
    succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    if [ $? == 0 ]; then
	rdiff-backup --force --remove-older-than 1M $d_dir #移除一个月以前的备份文件
	[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息
    fi;
    else
    fail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    fi;
done  
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #输入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than 1 month files is all above)\n" >> "$log_file"

第一次备份

在下面环境运行以上脚本:

日志文件和data目录都正常:


第二次备份

进入原/home/back1目录里增加一个文件和删除一个文件后,进行第二次备份

data目录也正常:


测试多目录备份脚本

运行以下脚本:

结果和预料一样:


测试Linux定时任务

#!/bin/bash  
sour_dirs="/home/back1 /home/back0" # 设置要备份的目录列表
dest_dirs="/home/backEnd2" # 设置备份目标目录(远程或本地)
log_file="/home/backEnd2/back.log" # 设置备份日志文件的路径 
date=$(date +'%Y%m%d %H:%M:%S') #备份的日期

[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目标目录不存在就创建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就创建
echo "===========================${date}=======================" >>$log_file  
for s_dir in $sour_dirs
do  
    d_dir=$dest_dirs${s_dir}.dir
    [ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就创建
    rdiff-backup $s_dir $d_dir #将源文件分别备份为 源文件名.dir
    if [ $? == 0 ]; then   #如果上一个命令没出问题就继续
    succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    if [ $? == 0 ]; then
	rdiff-backup --force --remove-older-than 15m $d_dir #移除15分钟以前的备份文件
	[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息
    fi;
    else
    fail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    fi;
done  
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #输入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than 1 month files is all above)\n" >> "$log_file"

1. 宝塔面板

成功定时启动了shell脚本:


backEnd2

一分钟执行一次脚本,删除5分钟前的备份(无差异备份的话,不会删除):

#!/bin/bash  
sour_dirs="/home/back1 /home/back0" # 设置要备份的目录列表
dest_dirs="/home/backEnd2" # 设置备份目标目录(远程或本地)
log_file="/home/backEnd2/back.log" # 设置备份日志文件的路径 
date=$(date +'%y%m%d %H:%M:%S') #备份的日期

[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目标目录不存在就创建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就创建
echo "===========================${date}=======================" >>$log_file  
for s_dir in $sour_dirs
do  
    d_dir=$dest_dirs${s_dir}.dir
    [ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就创建
    rdiff-backup $s_dir $d_dir #将源文件分别备份为 源文件名.dir
    if [ $? == 0 ]; then   #如果上一个命令没出问题就继续
    succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    if [ $? == 0 ]; then
	rdiff-backup --force --remove-older-than 5m $d_dir #移除5分钟以前的备份文件
	[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息
    fi;
    else
    fail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    fi;
done  
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #输入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than files is all above)\n" >> "$log_file"

15:55

1分钟后:

 在back1里创建文件:

发现有很多文件但没删除:(因为无差异备份的话,不会删除)

看back0:

继续一直在back1创建文件,在back0也创建:

过一会发现有差异备份且过了5分钟的文件都删除了,包括前面文件中没有差异备份的。

测试完成


2. Linux定时任务命令

        定时任务无非就是在什么时间干什么命令。文件怎么配置?定时任务一般用root执行,这里介绍crontab,crontab -e 用户定时任务,有语法检查功能。直接编辑系统的定时任务:

vim /etc/crontab

可以在里面直接写,但一般用crontab -e写:

crontab -e

接下来就是怎么去写?

* * * * * echo hello

五颗星代表分时日月周

  • 分0-59
  • 时0-23 0表示凌晨12点
  • 日1-31天
  • 月1-12月
  • 周0-6天,0和7都表示星期天

示例1:每天七点半吃早餐

30 07 * * * root echo 吃早餐 #写echo,实际当前解释器是看不到的,可以通过日志查看

示例2:每天晚上11点准时睡觉

00 23 * * * root echo 睡觉

示例3:每分钟输出自己的姓名

* * * * * root echo GR

示例4:每个小时的第5分钟执行echo hello

5 * * * * root echo hello

示例5:每10分钟执行echo hello

10 * * * * root echo hello

示例6:早上7点到上午11点执行echo hello

00 7-11 * * * root echo hello

示例7:早上7点到上午11点,下午一点到下午三点执行echo hello

00 7-11,13-15 * * * root echo hello #用逗号表示间隔

简单看下配置文件:

2.1 系统配置文件
  • /etc/crontab 系统定时任务
  • /var/log/cron 定时任务日志
  • /var/spool/mail/root 是root的邮件信息,每执行一次就提示一次信息(一般都关闭这个,因为影响性能)
  • /etc/cron.hourly 每小时执行一次的定时任务配置文件
  • /etc/cron.daily 每天执行一次的定时任务配置文件
  • /etc/cron.weekly 每周执行一次的定时任务配置文件
  • /etc/cron.monthly 每月执行一次的定时任务配置文件
  • /etc/cron.deny 不允许哪个用户进行定时任务
2.2 用户的配置文件
  • /var/spool/cron/root 用户定时任务,vim编辑但不支持语法检查,用crontab -e就可以检查了
  • crontab -e 编辑 ---->实际写入到/var/spool/cron/          #有语法检测的功能
  • crontab -l 列出定时任务

3 crontab -e

rbShell2.sh的内容:(删除5分钟前的备份)

#!/bin/bash  
sour_dirs="/home/back1 /home/back0" # 设置要备份的目录列表
dest_dirs="/home/backEnd3" # 设置备份目标目录(远程或本地)
log_file="/home/backEnd3/back.log" # 设置备份日志文件的路径 
date=$(date +'%y%m%d %H:%M:%S') #备份的日期

[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目标目录不存在就创建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就创建
echo "===========================${date}=======================" >>$log_file  
for s_dir in $sour_dirs
do  
    d_dir=$dest_dirs${s_dir}.dir
    [ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就创建
    rdiff-backup $s_dir $d_dir #将源文件分别备份为 源文件名.dir
    if [ $? == 0 ]; then   #如果上一个命令没出问题就继续
    succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    if [ $? == 0 ]; then
	rdiff-backup --force --remove-older-than 5m $d_dir #移除5分钟以前的备份文件
	[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息
    fi;
    else
    fail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    fi;
done  
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #输入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than files is all above)\n" >> "$log_file"


3.1 定时测试:

(次数测试的时候,脚本里面是删除30分钟前的)

每天的11:20执行一次脚本(五个* 分别是,分,时,日,月,周)

执行结果,成功执行:


如果想每10分钟执行一次怎么写的,注意:这样写是每小时的第10分钟执行一次

10 * * * * sh /home/rtx/rdiff-backupTest/rdiff-backup_shell/rbShell.sh

 目前时间11:25

13:10:后


3.2 每分钟测试

每1分钟自动执行一次(在第一颗*后面加/1):

*/1 * * * * sh /home/rtx/rdiff-backupTest/rdiff-backup_shell/rbShell.sh

现在是16.14

1分钟后发现自动完成了备份:

在back1里创建文件:

过了几分钟:

因为在16:20又创建了文件,过了几分钟发现16:20及之前的文件都被删除了:

符合预期


3.3 定时任务注意事项

  • 在定时任务中不识别%需要加转义\% 或者将命令写到脚本里面
  • 执行脚本尽量前面加上sh或者bash使用
  • /server/scripts/backup.sh 需要给脚本执行权限
  • sh /server/scripts/backup.sh 不需要脚本执行权限

        执行脚本的结果,定时任务的结果定向到空或者文件中,在执行每条定时任务后,系统会自动给用户发送文件信息,/var/spool/mail/root 对于有用户访问的服务器会将邮件功能关闭 以减少性能损失,关闭后定时任务执行后发邮件发布出去,会生成临时的小文件,执行一行定时任务会执行一个小文件,小文件越多会导致inode不够用,无法写入数据到磁盘。

查看邮件功能是否开启:

systemctl stat postfix.service

关闭邮件功能:

systemctl stop postfix.service
  • 避免不必要的程序及命令输出,比如tar zcf,tar zcvf,不用v

  • 打包尽量到相对路径,一般打包都先cd,在tar,但是当前解释器不会真的cd,而是在新的解释器下,所以不影响当前界面。

        定时任务的脚本中,程序尽量使用绝对路径,用户定时任务识别的PATH变量,只有/usr/bin/和/bin目录,使用crontab定义定时任务时 只去/usr/bin/和/bin下面查找任务,比如使用ntpdate就成功不了,可以去查看邮件,邮件辅助我们排查问题

写定时脚本的流程

  1. 命令行可以执行成功
  2. 写入脚本,执行脚本可以执行成功
  3. 写入定时任务进行测试
  4. 排查问题(结果,postfix开启邮件,个人经验)

3.4 实际测试

#!/bin/bash
sour_dirs="/home/data" # 设置要备份的目录列表
dest_dirs="/home/back/databack" # 设置备份目标目录(远程或本地)
log_file="/home/back/back.log" # 设置备份日志文件的路径 
date=$(date +'%Y%m%d %H:%M:%S') #备份的日期

[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目标目录不存在就创建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就创建
echo "===========================${date}=======================" >>$log_file  
for s_dir in $sour_dirs
do  
    d_dir=${dest_dirs}
    [ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就创建
    rdiff-backup $s_dir $d_dir #将源文件分别备份为 源文件名.dir
    if [ $? == 0 ]; then   #如果上一个命令没出问题就继续
    succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    if [ $? == 0 ]; then
	rdiff-backup --force --remove-older-than 7D $d_dir
	[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息
    fi;
    else
    fail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    fi;
done  
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #输入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than files is all above)\n" >> "$log_file"


3.5 测试睡眠时产生多个文件

睡眠一分钟,一分钟内创建了一个目录,进入新创建的目录,在里面创建一个文件和一个目录:

        发现睡眠和创建文件都执行了多次(一分钟一次,用创建精确到秒的txt文件来代替调用脚本),现在测试一下用天的日期作为flag来让其一天执行一次类似调用脚本的操作。

测试以下shell.sh:

#!/bin/bash    

# 设置要监视的目录路径    
FILE_PATH="/home/data"

# 注意:这里只使用 path 变量,并忽略 action 和 file(因为它们不是默认输出的一部分)  
inotifywait -mr -e create "$FILE_PATH" | while read path action file; do
    # 假设 path 变量现在包含完整的文件路径
    log_file="/home/rtx/log/monitor1_log/$(date +"%Y-%m-%d").log"

    # 如果文件存在就进入下一次监控,保证else后面的代码一天只执行一次
    if [ -f "$log_file" ];
       echo "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$file' 已被 '$action' "
       echo "日志存在,进入下一次监控"
    else
        # 如果日志文件不存在且不是目录,则创建它    
        sleep 60
        touch "$log_file"
        # 所有输出重定向到当天的日志文件
        exec >> "$log_file" 2>&1

        echo "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$file' 已被 '$action' "
        echo "---------------------------------------"
        echo "脚本被调用"
        touch /home/rtx/Test$(date +"%Y-%m-%d-%H-%M-%S").txt
    fi
done

3.6 最终备份脚本

#!/bin/bash
sour_dirs="/home/home /home/admin" # 设置要备份的目录列表
dest_dirs="/home/back" # 设置备份目标目录(远程或本地)
log_file="/home/log/back_log/$(date +'%Y-%m-%d').log" # 设置备份日志文件的路径 
date=$(date +'%Y-%m-%d %H:%M:%S') #备份的日期

[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目标目录不存在就创建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就创建
# 所有输出重定向到当天的日志文件
exec >> "$log_file" 2>&1
echo "===========================${date}======================="
for s_dir in $sour_dirs
do
    d_dir=$dest_dirs${s_dir}_back
    [ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就创建
    rdiff-backup $s_dir $d_dir #将源文件分别备份为 源文件名_back
    if [ $? == 0 ]; then   #如果上一个命令没出问题就继续
    succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    if [ $? == 0 ]; then
        rdiff-backup --force --remove-older-than 6M $d_dir #移除6个月以前的备份文件
        [ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息
    fi;
    else
    fail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    fi;
done
echo -e "[BACKUP SUCCESS]\n$succ_msg" #输入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg"
echo -ne "[REMOVE FILES ]\n${rmv_msg}"
echo -e "(remove older than files is all above)\n"


监控Linux目录差异

        inotifywait 是一个用于监控文件系统事件的命令行工具,属于 inotify-tools 软件包。它基于 Linux 内核的 inotify 功能,可以实时监听文件或目录的变化,如创建、删除、修改等事件。

安装所用工具:

sudo yum install inotify-tools

命令行运行后可以发现输出了三个字段,这三个字段在后面的脚本可用可不用。

运行脚本:

#!/bin/bash    
    
# 设置要监视的目录路径    
FILE_PATH="/home/data"     
    
# 初始化日志(可选,有助于确认脚本已启动)    
echo "开始监视目录 '$FILE_PATH'..."
    
# 监视文件修改和创建事件(还可监视删除,打开关闭等)
# 注意:这里只使用 path 变量,忽略 action 和 file(因为它们不是默认输出的一部分)  
inotifywait -mr -e modify,create "$FILE_PATH" | while read path; do    
    sleep 10
    # 可以添加对特定文件的条件检查或调用其他脚本  
    # 例如:if [ "$path" == "$FILE_PATH/specific_file.txt" ]; then ... fi  
    # 调用脚本
    /home/data/shell.sh 
done

# nohup /home/shell.sh > /home/test.log 2>&1 &
  • -m 选项表示以监视模式运行,即持续监控而非一次性运行。
  • -r 选项表示递归监视指定目录及其子目录。
  • -e modify,create 指定监视的事件类型,这里监视文件的修改和创建。
  • "$FILE_PATH" 是要监视的目录路径。
  • | 将 inotifywait 的输出传递给后续的 while read 循环。
  • while read path; do 循环从 inotifywait 的输出中读取每一行,path 变量包含了文件路径和事件信息(inotifywait 的默认输出中通常包括事件的路径和操作)

输入以下命令在后台运行上面的脚本

nohup /home/shell.sh > /home/test.log 2>&1 &
  • nohup:允许脚本在你退出终端后继续运行。
  • /home/shell.sh:脚本的完整路径。
  • > /home/test.log:将标准输出重定向到 test.log 文件。
  • 2>&1:将标准错误也重定向到 test.log 文件。
  • &:将命令放到后台执行。

如果在脚本里输出了日志到其他文件,可以把标准输出重定向到空文件:

nohup /home/rtx/shell.sh > /dev/null 2>&1 &

FILE_PATH="/home/rtx/data"  
   
# 注意:这里只使用 path 变量,并忽略 action 和 file(因为它们不是默认输出的一部分)  
inotifywait -mr -e modify,create "$FILE_PATH" | while read path; do    
    # 假设 path 变量现在包含完整的文件路径
    sleep 7
    log_file="/home/rtx/log/$(date +"%Y-%m-%d").log"
    
    # 如果日志文件不存在且不是目录,则创建它    
    [ ! -f "$log_file" ] && touch "$log_file"
    # 所有输出重定向到当天的日志文件
    exec > "$log_file" 2>&1
    
    echo "---------------------------------------"
    echo "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$path' 已被修改或创建"
    
    # 在这里可以添加对特定文件的条件检查或调用其他脚本  
    # 例如:if [ "$path" == "$FILE_PATH/specific_file.txt" ]; then ... fi  
    
    # 调用脚本(如果需要)    
    # script.sh "$path"    
done


最终测试

把前面定时任务的脚本改一下日志:

#!/bin/bash
sour_dirs="/home/data" # 设置要备份的目录列表
dest_dirs="/home/back/databack" # 设置备份目标目录(远程或本地)
log_file="/home/log/back_log/$(date +'%Y-%m-%d').log" # 设置备份日志文件的路径 
date=$(date +'%Y-%m-%d %H:%M:%S') #备份的日期
​
[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目标目录不存在就创建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就创建
# 所有输出重定向到当天的日志文件
exec > "$log_file" 2>&1
echo "===========================${date}======================="
for s_dir in $sour_dirs
do  
    d_dir=${dest_dirs}
    [ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就创建
    rdiff-backup $s_dir $d_dir #将源文件分别备份为 源文件名.dir
    if [ $? == 0 ]; then   #如果上一个命令没出问题就继续
    succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    if [ $? == 0 ]; then
    rdiff-backup --force --remove-older-than 7D $d_dir
    [ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息
    fi;
    else
    fail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息
    fi;
done  
echo -e "[BACKUP SUCCESS]\n$succ_msg" #输入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg"
echo -ne "[REMOVE FILES ]\n${rmv_msg}"
echo -e "(remove older than files is all above)\n"

监控脚本改一下日志和调用上面的脚本:

#!/bin/bash    
    
# 设置要监视的目录路径    
FILE_PATH="/home/rtx/data"  
   
# 注意:这里只使用 path 变量,并忽略 action 和 file(因为它们不是默认输出的一部分)  
inotifywait -mr -e modify,create "$FILE_PATH" | while read path; do    
    # 假设 path 变量现在包含完整的文件路径
    sleep 7
    log_file="/home/log/monitor_log/$(date +"%Y-%m-%d").log"
    
    # 如果日志文件不存在且不是目录,则创建它    
    [ ! -f "$log_file" ] && touch "$log_file"
    # 所有输出重定向到当天的日志文件
    exec > "$log_file" 2>&1
    
    echo "---------------------------------------"
    echo "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$path' 已被修改或创建"
    
    # 在这里可以添加对特定文件的条件检查或调用其他脚本  
    # 例如:torif [ "$path" == "$FILE_PATH/specific_file.txt" ]; then ... fi  
    
    # 调用脚本(如果需要)    
    # script.sh "$path"   
    /home/shellTest.sh 
done

数据也备份了:


测试普通用户监视:

最终监控脚本

#!/bin/bash    
    
# 设置要监视的目录路径    
FILE_PATH="/home/data" 

error_log="/home/admin/log/error.log" #错误日志,确保创建好,因为还没重定向到每天的日志
 
# 设置日志目录,下面还会创建每天的日志文件
LOG_DIR="/home/admin/log/auto_monitor_log"
if [ ! -d $LOG_DIR ]; then
    mkdir -p $LOG_DIR #如果目标目录不存在就创建
    if [ $? -ne 0 ]; then #如果上一条命令不正常
        echo "$(date +"%Y-%m-%d %H:%M:%S") 无法创建日志目录 '$LOG_DIR'" >> $error_log
    fi
fi

# 监控上面目录的创建操作,把输出读取到path,action,file三个变量里 
inotifywait -mr -e create "$FILE_PATH" | while read path action file; do    
    # 定义当天的日志文件
    log_file="$LOG_DIR/$(date +"%Y-%m-%d").log"
    sleep 1

    # 如果文件存在就进入下一次监控,保证else后面的代码一天只执行一次
    if [ -f "$log_file" ]; then
       echo "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$file' 已被 '$action' "
       echo "$log_file 日志存在,进入下一次监控"
    else 
        # 如果日志文件不存在且不是目录,则创建它    
        sleep 60
        touch "$log_file"
        if [ $? -ne 0 ]; then #如果上一条命令不正常
            echo "$(date +"%Y-%m-%d %H:%M:%S") 无法创建日志文件 '$log_file'" >> $error_log
        fi
        # 所有输出重定向到当天的日志文件
        exec >> "$log_file" 2>&1
        echo "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$file' 已被 '$action' "
        echo "$(date +"%Y-%m-%d %H:%M:%S") 脚本被调用"
        echo "---------------------------------------"
    fi
done

本篇完。


http://www.kler.cn/a/581050.html

相关文章:

  • 【鸿蒙开发】Hi3861学习笔记- GPIO
  • Android 滑块开关 自定义Switch
  • 解决Element UI的el-date-picker组件默认值为当天日期但选择后不回显的问题
  • 每天一道算法题【蓝桥杯】【在排序数组中查找元素的第一个位置和最后一个位置】
  • 【MySQL篇】MySQL基本查询详解
  • 【推荐项目】Java的廊坊城市公交查询网站
  • 光谱相机检测肉类新鲜度的原理
  • 查看端口被占用命令
  • VMware安装Windows server 2016
  • # 如何确认elementary os (linux)使用的是Wayland而不是x11?
  • 【C语言】结构体篇
  • 联核科技AGV无人叉车能给企业带来哪些效益?
  • 【面试】JVM
  • 计算机考研C语言
  • C++设计模式-工厂模式:从原理、适用场景、使用方法,常见问题和解决方案深度解析
  • 工作记录 2017-01-04
  • 【CXX】6 内置绑定
  • Redis--Set类型
  • JVM、MySQL常见面试题(尽力局)
  • vue3中的深度选择器