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

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 #将源文件分别备份为 源文件名.dirif [ $? == 0 ]; then   #如果上一个命令没出问题就继续succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 1M $d_dir #移除一个月以前的备份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息fi;elsefail_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 #将源文件分别备份为 源文件名.dirif [ $? == 0 ]; then   #如果上一个命令没出问题就继续succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 15m $d_dir #移除15分钟以前的备份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息fi;elsefail_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 #将源文件分别备份为 源文件名.dirif [ $? == 0 ]; then   #如果上一个命令没出问题就继续succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 5m $d_dir #移除5分钟以前的备份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息fi;elsefail_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 #将源文件分别备份为 源文件名.dirif [ $? == 0 ]; then   #如果上一个命令没出问题就继续succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 5m $d_dir #移除5分钟以前的备份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息fi;elsefail_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 #将源文件分别备份为 源文件名.dirif [ $? == 0 ]; then   #如果上一个命令没出问题就继续succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 7D $d_dir[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息fi;elsefail_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 60touch "$log_file"# 所有输出重定向到当天的日志文件exec >> "$log_file" 2>&1echo "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$file' 已被 '$action' "echo "---------------------------------------"echo "脚本被调用"touch /home/rtx/Test$(date +"%Y-%m-%d-%H-%M-%S").txtfi
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
dod_dir=$dest_dirs${s_dir}_back[ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就创建rdiff-backup $s_dir $d_dir #将源文件分别备份为 源文件名_backif [ $? == 0 ]; then   #如果上一个命令没出问题就继续succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 6M $d_dir #移除6个月以前的备份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息fi;elsefail_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 7log_file="/home/rtx/log/$(date +"%Y-%m-%d").log"# 如果日志文件不存在且不是目录,则创建它    [ ! -f "$log_file" ] && touch "$log_file"# 所有输出重定向到当天的日志文件exec > "$log_file" 2>&1echo "---------------------------------------"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 #将源文件分别备份为 源文件名.dirif [ $? == 0 ]; then   #如果上一个命令没出问题就继续succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #获取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 7D $d_dir[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #获取日志信息fi;elsefail_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 7log_file="/home/log/monitor_log/$(date +"%Y-%m-%d").log"# 如果日志文件不存在且不是目录,则创建它    [ ! -f "$log_file" ] && touch "$log_file"# 所有输出重定向到当天的日志文件exec > "$log_file" 2>&1echo "---------------------------------------"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 ]; thenmkdir -p $LOG_DIR #如果目标目录不存在就创建if [ $? -ne 0 ]; then #如果上一条命令不正常echo "$(date +"%Y-%m-%d %H:%M:%S") 无法创建日志目录 '$LOG_DIR'" >> $error_logfi
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" ]; thenecho "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$file' 已被 '$action' "echo "$log_file 日志存在,进入下一次监控"else # 如果日志文件不存在且不是目录,则创建它    sleep 60touch "$log_file"if [ $? -ne 0 ]; then #如果上一条命令不正常echo "$(date +"%Y-%m-%d %H:%M:%S") 无法创建日志文件 '$log_file'" >> $error_logfi# 所有输出重定向到当天的日志文件exec >> "$log_file" 2>&1echo "$(date +"%Y-%m-%d %H:%M:%S")目录 '$FILE_PATH' 里 '$file' 已被 '$action' "echo "$(date +"%Y-%m-%d %H:%M:%S") 脚本被调用"echo "---------------------------------------"fi
done

本篇完。

相关文章:

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 恢复命令--…...

UE_C++ —— Metadata Specifiers

声明UClasses、UFunctions、UProperties、UEnums和UInterfaces时使用的元数据关键词,表示其与引擎和关卡编辑器诸多方面的互动方式; 当声明classe、interfaces、structs、enums、enum values、functions、or propertie时,可添加 Metadata Spe…...

【算法与数据结构】并查集详解

目录 一,什么是并查集 二,并查集的结构 三,并查集的代码实现 1,并查集的大致结构和初始化 2,find操作 3,Union操作 4,优化 小结: 四,并查集的应用场景 省份…...

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题,系统导入的数据和线下的EXCEL数据是否一致,如果不一致,如何快速找到差异值,原来脑海第一反应就是使用公…...

Windows操作系统部署Tomcat详细讲解

Tomcat是一个开源的Java Servlet容器,用于处理Java Web应用程序的请求和响应。以下是关于Tomcat的用法大全: 一、安装Tomcat 下载 访问Apache Tomcat官方网站(https://tomcat.apache.org/),根据你的操作系统&#xf…...

每日Attention学习23——KAN-Block

模块出处 [SPL 25] [link] [code] KAN See In the Dark 模块名称 Kolmogorov-Arnold Network Block (KAN-Block) 模块作用 用于vision的KAN结构 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as F import mathclass Swish(nn.Module)…...

今日写题04work

题目:移除链表元素 两种实现思路 思路一 使用双指针,prev,cur快慢指针解决。当cur不等于val,两个指针跳过。当等于val时,要考虑两种情况,一种是pos删,一种是头删除。 pos删除就是正常情况&am…...

Managed Lustre 和 WEKA:高性能文件系统的对比与应用

Managed Lustre 和 WEKA:高性能文件系统的对比与应用 1. 什么是 Managed Lustre?主要特点:适用场景: 2. 什么是 WEKA?主要特点:适用场景: 3. Managed Lustre 和 WEKA 的对比4. 如何选择 Managed…...

LeetCode541 反转字符串2

一、题目描述 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。具体规则如下: 如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等…...

MAC 系统关闭屏幕/睡眠 后被唤醒 Wake Requests

问题;查看wake 日志 pmset -g log | grep "Wake Requests" 为 Wake Requests [*processdasd requestSleepService...info"com.apple.alarm.user-invisible-com.apple.calaccessd...电源设置命令参考: pmset -g sched //查看定时…...

论文笔记:Multi-Head Mixture-of-Experts

2024 neurips 1 背景 稀疏混合专家(SMoE)可在不显著增加训练和推理成本的前提下提升模型的能力【比如Mixtral 8*7B,表现可以媲美LLaMA-2 70B】 但它也有两个问题 专家激活率低(下图左) 在优化时只有一小部分专家会被…...

vue和Django快速创建项目

一、VUE 1.创建 Vue 3 JavaScript 项目 npm create vitelatest 项目名称 -- --template vue创建 Vue 3 TypeScript 项目 npm create vitelatest 项目名称 -- --template vue-ts 2.然后 cd 项目名称 npm install npm install axios # 发送 API 请求 npm install pinia …...

Java LinkedList(单列集合)

LinkedList 是 Java 中实现了 List 接口的一个类,它属于 java.util 包。与 ArrayList 不同,LinkedList 是基于双向链表实现的,适合于频繁进行插入和删除操作的场景。 1. LinkedList 的基本特性 基于链表实现:LinkedList 使用双向…...

多线程基础面试题剖析

一、线程的创建方式有几种 创建线程的方式有两种,一种是继承Thread,一种是实现Runable 在这里推荐使用实现Runable接口,因为java是单继承的,一个类继承了Thread将无法继承其他的类,而java可以实现多个接口&#xff0…...

.NET SixLabors.ImageSharp v1.0 图像实用程序控制台示例

使用 C# 控制台应用程序示例在 Windows、Linux 和 MacOS 机器上处理图像,包括创建散点图和直方图,以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包(版本 1.0.4)添加到.NET Core 3.1/ …...

EasyExcel提取excel文档

目录 一、前言二、提取excel文档2.1、所有sheet----获取得到headerList和总行数2.2、所有sheet----获取合并单元格信息2.3、读取某个sheet的每行数据一、前言 EasyExcel 是阿里巴巴开源的一个高性能 Excel 读写库,相比于 Apache POI 和 JXL,它有明显的优势,特别是在处理大数…...

第十五届蓝桥杯嵌入式省赛真题(满分)

第十五届蓝桥杯嵌入式省赛真题 目录 第十五届蓝桥杯嵌入式省赛真题 一、题目 二、分析 1、配置 2、变量定义 3、LCD显示模块 4、按键模块 5、数据分析和处理模块 1、频率突变 2、频率超限 3、数据处理 三、评价结果 一、题目 二、分析 1、配置 首先是配置cubemx…...

ASP.NET Core Web应用(.NET9.0)读取数据库表记录并显示到页面

1.创建ASP.NET Core Web应用 选择.NET9.0框架 安装SqlClient依赖包 2.实现数据库记录读取: 引用数据库操作类命名空间 创建查询记录结构类 查询数据并返回数据集合 3.前端遍历数据并动态生成表格显示 生成结果:...

【Sceneform-EQR】实现3D场景背景颜色的定制化(背景融合的方式、Filament材质定制)

写在前面的话 Sceneform-EQR是基于(filament)扩展的一个用于安卓端的渲染引擎。故本文内容对Sceneform-EQR与Filament都适用。 需求场景 在使用Filament加载三维场景的过程中,一个3D场景对应加载一个背景纹理。而这样的话,即便…...

LeetCode1706

LeetCode1706 目录 LeetCode1706题目描述示例题目理解问题描述 示例分析思路分析问题核心 代码段代码逐行讲解1. 获取网格的列数2. 初始化结果数组3. 遍历每个球4. 逐行模拟下落过程5. 检查是否卡住6. 记录结果7. 返回结果数组 复杂度分析时间复杂度空间复杂度 总结的知识点1. …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 ​…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...