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备份通常可以分为以下几个层次,这些层次主要基于备份的广度和深度来划分:
- 完全备份(Full Backup):
- 完全备份是指将所有需要备份的数据全部进行备份。这种备份方式会备份整块硬盘、整个分区或某个具体的目录中的所有数据。
- 完全备份的优点是恢复时简单快捷,因为所有需要的数据都已经包含在备份文件中。
- 缺点是备份所需的时间和存储空间较大,特别是当数据量很大时。
- 增量备份(Incremental Backup):
- 增量备份是在完全备份的基础上,只备份自上一次备份(无论是完全备份还是增量备份)以来发生了更改的数据。
- 增量备份的优点是备份所需的时间和存储空间较小,因为它只备份新增或修改的数据。
- 缺点是恢复时可能需要多个备份文件(包括完全备份和多个增量备份),恢复过程相对复杂。
- 差异备份(Differential Backup):
- 差异备份与增量备份类似,但它是基于上一次完全备份来备份之后所有发生更改的数据。即每次差异备份都会备份自上一次完全备份以来所有新增或修改的数据。
- 差异备份的优点是恢复时相对增量备份简单,因为它只需要一个完全备份和一个最新的差异备份文件。
- 缺点是随着时间的推移,差异备份文件可能会变得很大,因为它包含了自上次完全备份以来的所有更改。
对于数据变化不大的系统,可以选择完全备份和定期的差异备份;而对于数据变化频繁的系统,则可以选择完全备份和频繁的增量备份。
普通的备份策略比如:(一周一次全量备份,一天一次增量备份,全量备份可以用宝塔定时备份保存三份文件,自己备份也可以。)
1.2 备份步骤和宝塔面板简介
一般备份步骤:
1. 数据识别与分类
- 识别重要数据:首先,需要明确哪些数据是业务关键或法律要求必须保留的。
- 数据分类:根据数据的敏感性、重要性和恢复时间目标(RTO)进行分类,以便制定合适的备份策略。
2. 备份策略制定
- 全备份与增量/差异备份:定期执行全备份,并在全备份之间执行增量或差异备份以减少存储需求和备份时间。
- 备份频率:根据数据变化频率和业务需求确定备份的频率。
- 备份保留周期:设定备份数据的保留时间,以满足合规性和历史记录需求。
3. 备份介质与存储
- 本地备份:使用硬盘、磁带或NAS/SAN等本地存储设备进行备份。
- 云备份:利用云服务提供商的存储服务进行远程备份,提供更高的数据可用性和灾难恢复能力。
- 混合备份:结合本地和云备份的优势,实现灵活的数据保护和恢复策略。
4. 系统配置备份
- 操作系统配置:备份操作系统的配置文件、注册表(Windows)或系统文件(Linux)。
- 应用程序配置:备份所有关键应用程序的配置文件、数据库连接字符串等。
- 网络配置:备份路由器、交换机、防火墙等网络设备的配置。
- 虚拟化环境配置:备份虚拟机模板、快照和虚拟机管理器的配置文件。
5. 备份验证与测试
- 备份验证:定期验证备份数据的完整性和可恢复性,确保备份过程没有错误。
- 灾难恢复演练:定期进行灾难恢复演练,测试备份数据的恢复流程和时间,确保在真实灾难发生时能够迅速恢复业务。
6. 安全与合规性
- 加密备份数据:对备份数据进行加密,防止数据在传输和存储过程中被未经授权访问。
- 访问控制:对备份存储设备和备份过程实施严格的访问控制,确保只有授权人员能够访问备份数据。
- 合规性:确保备份策略符合行业法规和标准,如GDPR、HIPAA等。
7. 自动化与监控
- 自动化备份:使用自动化工具或脚本来执行备份任务,减少人为错误并提高备份效率。
- 监控与报警:实时监控备份过程和备份存储设备的状态,设置报警机制以便在出现问题时及时响应。
宝塔面板有上部分的大部分功能,快照的话,环境也会备份。
1.3 CentOS7重要目录
在CentOS 7的备份过程中,根目录(/
)下的目录哪些需要被备份,主要取决于系统的具体使用情况和数据的重要性。以下是一些通常需要备份的关键目录:
/etc
:- 这个目录包含了系统的配置文件,包括网络配置(如
/etc/sysconfig/network-scripts/
)、SSH配置(/etc/ssh/
)、防火墙和SELinux配置(/etc/firewalld/
、/etc/selinux/
)、主机名和主机文件(/etc/hostname
、/etc/hosts
)等。这些配置文件对于系统的正常运行至关重要,因此在备份时必须包含。
- 这个目录包含了系统的配置文件,包括网络配置(如
/home
:- 用户的主目录通常位于此目录下,每个用户都有一个以其用户名命名的目录,其中包含用户的个人文件、配置、下载等。这些目录对于保留用户数据至关重要,因此在备份时必须包括。
/root
:- 如果root用户经常用于执行重要任务或存储关键文件,那么
/root
目录也应该被备份。这个目录包含了root用户的主目录和可能存储在其中的配置文件或重要数据。
- 如果root用户经常用于执行重要任务或存储关键文件,那么
/var/log
:- 日志文件对于系统的故障排查和历史记录非常有用。如果需要保存系统的历史记录或用于后续的审计,那么
/var/log
目录也应该被备份。
- 日志文件对于系统的故障排查和历史记录非常有用。如果需要保存系统的历史记录或用于后续的审计,那么
- 数据库目录:
- 如果系统上运行有数据库服务(如MySQL、PostgreSQL等),那么数据库的数据目录和配置文件也需要被备份。具体的数据目录位置取决于数据库的配置,但通常可以在数据库的配置文件中找到(如MySQL的
/etc/my.cnf
)。
- 如果系统上运行有数据库服务(如MySQL、PostgreSQL等),那么数据库的数据目录和配置文件也需要被备份。具体的数据目录位置取决于数据库的配置,但通常可以在数据库的配置文件中找到(如MySQL的
/usr/local
(或特定应用安装目录):- 如果在
/usr/local
或系统的其他非标准位置安装了第三方软件或应用,那么这些目录也应该被备份。这包括应用程序的可执行文件、库文件、配置文件和数据文件。
- 如果在
- 其他重要目录:
- 根据系统的具体使用情况,可能还有其他重要目录需要被备份,如
/var/spool/mail
(系统邮件目录)、/var/spool/cron
(计划任务目录)等。
- 根据系统的具体使用情况,可能还有其他重要目录需要被备份,如
需要注意的是,在备份过程中,一些目录可能会被排除在外,因为它们包含了临时文件或系统运行时所需的动态生成的文件。例如,/proc
、/sys
、/tmp
等目录通常不需要备份,因为它们在系统重启后会被重新生成或清空。
此外,对于整个系统的备份,可以使用tar
命令或dd
命令等工具来实现。tar
命令可以用于打包和压缩特定的目录和文件,而dd
命令则可以用于备份整个硬盘或分区。在选择备份方法时,应根据系统的具体需求和数据的重要性来决定。
最后,备份完成后,应将备份文件存储在安全可靠的位置,如外部硬盘、云存储或远程服务器,以确保在数据丢失或系统故障时能够迅速恢复。
关机原因那个应该就是尝试重启到16700次,但是没有重启成功,同时slurmd还在运行,当时说下载东西,刚才查了一下有这种重启很多次就会影响性能,然后性能不好的同时下载很多东西可能服务器就断了,推测是这样。
fVjWeDNS.service网上搜不到,冠凌那边看他们的回复应该也不知道这个服务是干嘛的,我觉得可以先把尝试启动/bin/rRUBHDfR的那一行注释掉,因为也找不到这个文件夹,一直尝试执行也是个问题。
在Linux系统中,目录结构遵循一套标准规范,不同的目录用于存放不同类型的文件和数据。以下是您提到的目录的详细解释以及是否需要备份的建议:
目录解释
在Linux系统中,目录结构遵循一套标准规范,不同的目录用于存放不同类型的文件和数据。以下是您提到的目录的详细解释以及是否需要备份的建议:
-
bin
: 存放基本的用户命令(如ls
,cp
,mv
等),通常是系统启动时需要的基本命令。
备份建议: 建议备份,因为它包含基本的系统命令。 -
dev
: 包含设备文件,这些文件表示系统中的设备(如硬盘、终端等)。
备份建议: 通常不需要备份,因为这些文件在系统重启时会自动生成。 -
home
: 存放用户的个人文件和设置,每个用户在此目录下有一个子目录。
备份建议: 强烈建议备份,因为它包含用户的个人数据和配置。 -
lib
: 包含系统和应用程序所需的共享库文件(动态链接库)。
备份建议: 建议备份,因为某些应用程序和系统命令依赖于这些库。 -
lib64
: 64位系统的共享库目录,类似于lib
,但专门用于64位库。
备份建议: 建议备份,尤其在64位系统上。 -
mnt
: 通常为空,作为临时挂载文件系统的挂载点。
备份建议: 通常不需要备份。 -
proc
: 虚拟文件系统,提供关于系统和进程的信息。
备份建议: 不需要备份,因为这些文件是动态生成的。 -
rpm
: 用于存放RPM包的目录,可能包含软件包的管理信息。
备份建议: 如果有特殊的软件包或信息,可以考虑备份。 -
sbin
: 存放系统管理员使用的命令(如shutdown
,ifconfig
等)。
备份建议: 建议备份,因为这些命令通常需要在系统维护时使用。 -
srv
: 存放服务相关的数据,如HTTP服务器、FTP服务器的数据等。
备份建议: 根据服务的需要,建议备份。 -
tmp
: 存放临时文件,系统和用户都可以使用,通常在重启后清空。
备份建议: 不需要备份,因为其内容是临时的。 -
var
: 存放可变数据文件,如日志文件、邮件队列、数据库文件等。
备份建议: 强烈建议备份,因为它包含系统运行中的重要数据。 -
boot
: 包含启动加载器和内核文件,系统启动所需的文件。
备份建议: 建议备份,特别是在系统重装或恢复时。 -
etc
: 存放系统配置文件和目录(如网络设置、用户账户等)。
备份建议: 强烈建议备份,因为这些配置对于系统的正常运行至关重要。 -
media
: 通常用于挂载可移动媒体(如USB驱动器、CD-ROM等)。
备份建议: 根据需要,备份可移动媒体中的数据。 -
opt
: 存放附加的第三方应用程序。
备份建议: 根据具体安装的应用程序,建议备份。 -
root
: 超级用户的家目录。
备份建议: 建议备份,因为可能包含重要的配置和数据。 -
run
: 包含当前运行时信息(如PID文件)。
备份建议: 不需要备份,因为其内容是动态的。 -
slurm
: 如果系统使用SLURM作为作业调度程序,通常包含相关的文件和信息。
备份建议: 根据使用情况,可能需要备份。 -
sys
: 提供系统信息,通常是虚拟文件系统。
备份建议: 不需要备份,因为其内容是动态的。 -
usr
: 包含用户程序和共享数据,通常分为bin
,lib
,sbin
,share
等子目录。
备份建议: 建议备份,因为包含很多用户级别的应用程序。 -
www
: 通常是Web服务器的根目录。
备份建议: 强烈建议备份,尤其是Web内容。
总结
- 强烈建议备份的目录:
home
,var
,etc
,usr
,boot
,www
- 建议备份的目录:
bin
,lib
,lib64
,sbin
,srv
,opt
,root
,rpm
- 通常不需要备份的目录:
dev
,mnt
,proc
,tmp
,run
,sys
要加的目录:
-
bin
: 存放基本的用户命令(如ls
,cp
,mv
等),通常是系统启动时需要的基本命令。
备份建议: 建议备份,因为它包含基本的系统命令。 -
lib
: 包含系统和应用程序所需的共享库文件(动态链接库)。
备份建议: 建议备份,因为某些应用程序和系统命令依赖于这些库。 -
lib64
: 64位系统的共享库目录,类似于lib
,但专门用于64位库。
备份建议: 建议备份,尤其在64位系统上。 -
sbin
: 存放系统管理员使用的命令(如shutdown
,ifconfig
等)。
备份建议: 建议备份,因为这些命令通常需要在系统维护时使用。 -
srv
: 存放服务相关的数据,如HTTP服务器、FTP服务器的数据等。
备份建议: 根据服务的需要,建议备份。 -
var
: 存放可变数据文件,如日志文件、邮件队列、数据库文件等。
备份建议: 强烈建议备份,因为它包含系统运行中的重要数据。 -
boot
: 包含启动加载器和内核文件,系统启动所需的文件。
备份建议: 建议备份,特别是在系统重装或恢复时。 -
etc
: 存放系统配置文件和目录(如网络设置、用户账户等)。
备份建议: 强烈建议备份,因为这些配置对于系统的正常运行至关重要。 -
root
: 超级用户的家目录。
备份建议: 建议备份,因为可能包含重要的配置和数据。 -
slurm
: 如果系统使用SLURM作为作业调度程序,通常包含相关的文件和信息。
备份建议: 根据使用情况,可能需要备份。 -
usr
: 包含用户程序和共享数据,通常分为bin
,lib
,sbin
,share
等子目录。
备份建议: 建议备份,因为包含很多用户级别的应用程序。 -
www
: 通常是Web服务器的根目录。
备份建议: 强烈建议备份,尤其是Web内容。 -
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
:设置连接超时时间,单位为秒。
示例
-
本地目录同步:
rsync -avz /source/directory/ /destination/directory/
这个命令会将
/source/directory/
目录下的所有内容(包括子目录和文件)同步到/destination/directory/
,同时保持文件属性、压缩数据,并显示详细过程。 -
通过 SSH 远程同步:
rsync -avz -e "ssh -p 2222" /local/directory/ user@remotehost:/remote/directory/
这个命令会将本地的
/local/directory/
目录通过 SSH(假设 SSH 端口为 2222)同步到远程主机remotehost
的/remote/directory/
目录下。 -
删除目标目录中不存在的文件:
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的备份策略中,tar
、rsync
和rdiff-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就成功不了,可以去查看邮件,邮件辅助我们排查问题
写定时脚本的流程
- 命令行可以执行成功
- 写入脚本,执行脚本可以执行成功
- 写入定时任务进行测试
- 排查问题(结果,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 恢复命令--…...
Netty基础—4.NIO的使用简介一
大纲 1.Buffer缓冲区 2.Channel通道 3.BIO编程 4.伪异步IO编程 5.改造程序以支持长连接 6.NIO三大核心组件 7.NIO服务端的创建流程 8.NIO客户端的创建流程 9.NIO优点总结 10.NIO问题总结 1.Buffer缓冲区 (1)Buffer缓冲区的作用 (2)Buffer缓冲区的4个核心概念 (3)使…...
贪心算法简介(greed)
前言: 贪心算法(Greedy Algorithm)是一种在每个决策阶段都选择当前最优解的算法策略,通过局部最优的累积来寻求全局最优解。其本质是"短视"策略,不回溯已做选择。 什么是贪心、如何来理解贪心(个人对贪心的…...
驻场运维服务方案书(Word文件)
目 录 第一章 背景分析 1.1. 项目背景 1.2. 项目目标 1.3. 系统现状 1.3.1. 网络系统 1.3.2. 设备清单梳理 1.3.3. 应用系统 第二章 需求分析及理解 2.1. 在重要日期能保障信息系统安全 2.2. 信息系统可长期安全、持续、稳定的运行 2.3. 提升发现安全问题、解决安全…...
嵌入式硬件--开发工具-AD使用常用操作
ad16.1.12 1.如何显示/隐藏其他图层 在pcb界面点击L--试图界面中找到“视图选项”--单层模式选择 not in single layer mode 在pcb界面点击L--试图界面中找到“视图选项”--单层模式选择 gray scale other layers 【Altium】AD如何只显示一层,隐藏其他层显示&…...
在 Ubuntu 上安装和配置 Docker 的完整指南
Docker 是一个开源的平台,旨在简化应用程序的开发、部署和运行。通过将应用程序及其依赖项打包到容器中,Docker 确保应用程序可以在任何环境中一致地运行。 目录 前言安装前的准备安装 Docker 步骤 1:更新包索引步骤 2:安装必要…...
微服务全局ID方案汇总
自增id 对于大多数系统来说,使用mysql的自增id当作主键再最合适不过了。在数据库层面就可以获取一个顺序的、唯一的、空间占用少的id。 自增id需要是 int、bigint这些整数类型,uint 支持 40 亿的数据量,bigint unsign(0 &#x…...
实验5 逻辑回归
实验5 逻辑回归 【实验目的】掌握逻辑回归算法 【实验内容】处理样本,使用逻辑回归算法进行参数估计,并画出分类边界 【实验要求】写明实验步骤,必要时补充截图 1、参照“2.1梯度下降法实现线性逻辑回归.ipynb”和“2.2 sklearn实现线性逻辑…...
【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]
1 起因 在公共高性能服务器上运行OllamaDeepSeek,如果按照默认配置启动Ollama程序,则自己在远程无法连接你启动的Ollama服务。 如果修改掉默认的配置,则会遇到你的Ollama被他人完全控制的安全风险。 不过,我们可以使用一个方向…...
Linux 下 MySQL 8 搭建教程
一、下载 你可以从 MySQL 官方下载地址 下载所需的 MySQL 安装包。 二、环境准备 1. 查看 MySQL 是否存在 使用以下命令查看系统中是否已经安装了 MySQL: rpm -qa|grep -i mysql2. 清空 /etc/ 目录下的 my.cnf 执行以下命令删除 my.cnf 文件: [roo…...
vue 仿deepseek前端开发一个对话界面
后端:调用deepseek的api,所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…...
MinIO问题总结(持续更新)
目录 Q: 之前使用正常,突然使用空间为0B,上传文件也是0B(部署在k8s中)Q: 无法上传大文件参考yaml Q: 之前使用正常,突然使用空间为0B,上传文件也是0B(部署在k8s中) A: 1、检查pod状态…...
STM32配套程序接线图
1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…...
深入理解Linux网络随笔(七):容器网络虚拟化--Veth设备对
深入理解Linux网络随笔(七):容器网络虚拟化 微服务架构中服务被拆分成多个独立的容器,docker网络虚拟化的核心技术为:Veth设备对、Network Namespace、Bridg。 Veth设备对 veth设备是一种 成对 出现的虚拟网络接口&…...
实战指南:鸿蒙ArkTS中实现列表下拉刷新与触底加载的完整解析
前言: 在移动应用开发中,下拉刷新和触底加载更多是提升用户体验的核心功能。鸿蒙ArkUI框架通过Refresh组件和List组件的onReachEnd事件,为开发者提供了简洁高效的实现方案。本文将通过代码示例,详解如何利用ArkTS实现这两个功能。…...
【栈数据结构应用解析:常见算法题详细解答】—— Leetcode
文章目录 栈的模拟实现删除字符串中的所有相邻重复项比较含退格的字符串基本计算器||字符串解码验证栈序列 栈的模拟实现 #include <iostream>using namespace std;const int N 1e5 10;// 创建栈 int stk[N], n;// 进栈 - 本质就是顺序表里面的尾插 void push(int x) …...
Git常用操作之GitLab
Git常用操作之GitLab 小薛博客官网:小薛博客Git常用操作之GitLab官方地址 1、GitLab安装 https://gitlab.cn/install/ 1、Docker安装GitLab https://docs.gitlab.cn/jh/install/docker.html 1、设置卷位置 在设置其他所有内容之前,请配置一个新的…...
2025探索短剧行业新可能报告40+份汇总解读|附PDF下载
原文链接:https://tecdat.cn/?p41043 近年来,短剧以其紧凑的剧情、碎片化的观看体验,迅速吸引了大量用户。百度作为互联网巨头,在短剧领域积极布局。从早期建立行业专属模型冷启动,到如今构建完整的商业生态…...
各省水资源平台 水资源遥测终端机都用什么协议
各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动,经过多年建设,基本都已经形成了稳定的通讯要求;河北瑾航科技 遥测终端机,兼容了大部分省市的通讯协议,如果需要,可以咨询和互相学习&…...
C#+EF+SqlServer性能优化笔记
文章目录 前言一、C#EF 代码优化1.接口代码改异步2.查询异步,只查询需要的数据3.查询数据判断时4.直接使用sql查询 二、数据库优化1.减少关联表,一些基础数据,字典表可以考虑放到redis中,在代码中映射2.增加索引,删除无…...
列表动态列处理
1、在initialize()方法里,获取列表控件,添加CreateListColumnsListener监听 public void initialize(){ BillList billlist(BillList)this.getControl("billlistap"); billlist.addCreateListColumnsListener(this::beforeCreateListColumns)…...
电机控制常见面试问题(十二)
文章目录 一.电机锁相环1.理解锁相环2.电机控制中的锁相环应用3.数字锁相环(DPLL) vs 模拟锁相环(APLL)4.锁相环设计的关键技术挑战5.总结 二、磁链观测1.什么是磁链?2.为什么要观测磁链?3.怎么观测磁链&am…...
芯驿电子 ALINX 亮相德国纽伦堡,Embedded World 2025 精彩回顾
2025年3月13日,全球规模最大的嵌入式行业盛会——德国纽伦堡国际嵌入式展(embedded world 2025)圆满落幕。 在这场汇聚全球 950 家展商、3 万余专业观众的科技盛宴中,芯驿电子 ALINX 展位人头攒动,多款尖端产品吸引客户…...
西门子S7-1200 PLC远程上下载程序方案
西门子S7-1200 PLC远程上下载程序方案(巨控GRM552YW-C模块) 三步完成配置 | 全球适用 | 稳定高效 三步快速完成远程配置 硬件部署 准备巨控GRM552YW-CHE模块1台,通过网口连接西门子S7-1200 PLC以太网口。 模块支持4G/5G/Wi-Fi/网线接入外网…...
MFC窗口的创建/消息映射机制
mfc.h #include<afxwin.h>//mfc头文件//应用程序类 class MyApp:public CWinApp //继承于应用程序类 { public://程序入口virtual BOOL InitInstance(); };//框架类 class MyFrame:public CFrameWnd { public:MyFrame();//声明宏 提供消息映射机制DECLARE_MESSAGE_MAP()…...
【每日学点HarmonyOS Next知识】tab对齐、相对布局、自定义弹窗全屏、动画集合、回到桌面
1、HarmonyOS Tabs 是否能支持 tabbar 居左对齐? 当前方案为自定义tabbar实现,示例demo: Entry Component struct TabsExample {State tabArray: Array<number> [0, 1,2]State focusIndex: number 0State pre: number 0State inde…...
如何在TikTok网页版切换地区设置
今天我们来聊聊如何在TikTok网页版上更改地区设置。TikTok作为全球知名的短视频社交应用,不仅仅局限于某个国家或地区。修改地区设置可以让你探索来自不同地方的内容,享受更为丰富的社交互动体验。那么,具体该如何操作呢?让我一步…...
redis工具类
前言 Redis 是一个高性能的键值存储系统,广泛应用于缓存、消息队列、实时分析等场景。为了更高效地操作 Redis,许多开发者会选择使用 Redisson 客户端库。 依赖配置 首先确保您的项目中已经包含了 Redisson 的最新版本(如 3.44.0ÿ…...
【Python办公】Excel通用匹配工具(双表互匹)
目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…...
安徽省青少年信息学奥林匹克竞赛初中组第1题LuoguP762
先放题目: 【题目背景】.你 .可 .以 .选 .择 .跳 .过 .背 .景 .部 .分。初春的一天,正是乍暖还寒时候,狂风乍起。小可可裹紧了单薄的外衣,往小雪家中赶去。“今天真不是个出门的时候啊!”小可可感叹道。“但是我还有东西要买………...
AVL树的平衡算法的简化问题
AVL树是一种紧凑的二叉查找树。它的每个结点,都有左右子树高度相等,或者只相差1这样的特性。文章https://blog.csdn.net/aaasssdddd96/article/details/106291144给出了一个例子。 为了便于讨论,这里对AVL树的结点平衡情况定义2个名称&#…...
NFS实验配置笔记
NFS NFS服务 nfs,最早是Sun这家公司所发展出来的,它最大的功能就是可以透过网络,让不同的机器,不同的操作系统,进行实现文档的共享。所以你可以简单的将他看做是文件服务器。 实验准备 ①先准备一个服务器端的操作…...
C盘清理技巧分享:释放空间,提升电脑性能
目录 1. 引言 2. C盘空间不足的影响 3. C盘清理的必要性 4. C盘清理的具体技巧 4.1 删除临时文件 4.2 清理系统还原点 4.3 卸载不必要的程序 4.4 清理下载文件夹 4.5 移动大文件到其他盘 4.6 清理系统缓存 4.7 使用磁盘清理工具 4.8 清理Windows更新文件 4.9 禁用…...
【云馨AI-大模型】RAGFlow功能预览:Dify接入外部知识库RAGFlow指南
介绍 Dify介绍 开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 原生应用。比 LangChain 更易用。官网:https://dify.ai/zh RAGFlow介绍 RAGFlow 是一款基于深度文档理解构建的…...
大模型学习笔记------Llama 3模型架构之旋转编码(RoPE)
大模型学习笔记------Llama 3模型架构之旋转编码(RoPE) 1、位置编码简介1.1 绝对位置编码1.2 相对位置编码 2、旋转编码(RoPE)2.1 基本概念---旋转矩阵2.2 RoPE计算原理2.2.1 绝对位置编码2.2.2 相对位置编码 3、旋转编码…...
Anthropic 的模型
Anthropic 的模型(特别是 Claude 系列)之所以在性能和推理能力上表现强劲,可以从技术设计、研究理念、训练方法以及应用优化等多个方面进行详细分析。以下是基于当前信息(截至 2025 年 3 月 13 日)和行业趋势的深入剖析…...
初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo
最近,我开始接触大模型开发,并尝试使用 LangChain 和 DeepSeek 构建了一个简单的 Demo。通过这个 Demo,我不仅加深了对大模型的理解,还体验到了 LangChain 和 DeepSeek 的强大功能。下面,我将分享我的开发过程以及一些…...
FPGA初级项目10——基于SPI的DAC芯片进行数模转换
FPGA初级项目10——基于SPI的DAC芯片进行数模转换 DAC芯片介绍 DAC 芯片(数字模拟转换器)是一种将数字信号转换为连续模拟信号(如电压或电流)的集成电路,广泛应用于电子系统中,连接数字世界与模拟世界。 …...
【论文解读】Contrastive Learning for Compact Single Image Dehazing(AECR-Net)
文章目录 问题创新网络主要贡献Autoencoder-like Dehazing NetworkAdaptive Mixup for Feature PreservingDynamic Feature Enhancement1. 可变形卷积的使用2. 扩展感受野3. 减少网格伪影4. 融合空间结构信息 Contrastive Regularization1. 核心思想2. 正样本对和负样本对的构建…...
unity基础——线段与拖尾
1、LineRenderer(线段渲染器) 为空物体加上组件添加材质 选择默认线段的材质 Default—Line Color:可以修改颜色Corner Vertices:角顶点 圆滑度 End Cap Vertices:边缘顶点 线段编辑 1、可以移动线段点的位置…...
【服务器知识】Nginx路由匹配规则说明
Nginx路由匹配规则说明 **一、Nginx路由匹配核心机制****二、匹配规则语法详解**1. **精确匹配 ()**2. **前缀匹配 (^~ 或 /)**3. **正则匹配 (~ 或 ~*)**4. **通配符匹配 (*)** **三、路由匹配优先级顺序****四、高级路由技巧**1. **条件判断 (if语句)**2. **路径重写 (rewrit…...
Python----数据可视化(Pyecharts三:绘图二:涟漪散点图,K线图,漏斗图,雷达图,词云图,地图,柱状图折线图组合,时间线轮廓图)
1、涟漪特效散点图 from pyecharts.globals import SymbolType from pyecharts.charts import EffectScatter from pyecharts.faker import Faker from pyecharts import options as opts from pyecharts.globals import ThemeType # 绘制图表 es (EffectScatter(init_optsop…...
机器学习中的梯度下降是什么意思?
梯度下降(Gradient Descent)是机器学习中一种常用的优化算法,用于最小化损失函数(Loss Function)。通过迭代调整模型参数,梯度下降帮助模型逐步逼近最优解,从而提升模型的性能。 1.核心思想 梯…...
C语言中的字符串与数组的关系
在C语言中,字符串和数组之间有着紧密的关系。理解它们的区别和联系对于编写高效且可靠的代码至关重要。在本篇博文中,我们将详细分析字符串和数组在C语言中的概念、它们的关系以及如何在编程中应用它们。 一、字符串与数组的基础知识 1.1 数组概念 在C语言中,数组是一组相…...
Ubuntu 18,04 LTS 通过APT安装mips64el的交叉编译器。
安装 g-5v的版本: sudo apt update sudo apt install g-5-mips64el-linux-gnuabi64 How to Install g-5-mips64el-linux-gnuabi64 in Ubuntu 18.04 安装 gcc/g-7v的版本: sudo apt-get install gcc-mips64el-linux-gnu* g-mips64el-linux-gnu* -y 安装…...
MySQL 衍生表(Derived Tables)
在SQL的查询语句select …. from …中,跟在from子句后面的通常是一张拥有定义的实体表,而有的时候我们会用子查询来扮演实体表的角色,这个在from子句中的子查询会返回一个结果集,这个结果集可以像普通的实体表一样查询、连接&…...
C++ vector 核心知识:常用操作与示例详解
在C编程中,vector 是标准模板库(STL)中最常用的容器之一。它以其动态数组的特性、高效的尾部操作和便捷的随机访问能力,成为处理动态数据的首选工具。无论是初学者还是经验丰富的开发者,掌握 vector 的使用方法和性能优…...
不同开发语言对字符串的操作
一、字符串的访问 Objective-C: 使用 characterAtIndex: 方法访问字符。 NSString *str "Hello, World!"; unichar character [str characterAtIndex:0]; // 访问第一个字符 H NSLog("%C", character); // 输出: H NSString 内部存储的是 UTF-16 编…...
Qt从入门到入土(十) -数据库操作--SQLITE
认识 数据库是用于存储、管理和检索数据的系统化集合。它是一种按照特定结构组织数据的存储方式,通过软件(数据库管理系统,DBMS)来实现数据的高效存储、查询、更新和管理。通过文件存储数据适用于少量的数据,而当拥有…...
硬件驱动——51单片机:独立按键、中断、定时器/计数器
目录 一、独立按键 1.原理 2.封装函数 3.按键控制点灯 数码管 二、中断 1.原理 2.步骤 3.中断寄存器IE 4.控制寄存器TCON 5.打开外部中断0和1 三、定时器/计数器 1.原理 2.控制寄存器TCON 3.工作模式寄存器TMOD 4.按键控制频率的动态闪烁 一、独立按键 1…...