crond服务介绍
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
1. 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。
在/etc/crontab文件,这个就是系统任务调度的配置文件。
2. 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。
用户可以使用crontab 工具来定制自己的计划任务。
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
各个字段的含义:
# minute:表示分钟,可以是从0到59之间的任何整数。
# hour:表示小时,可以是从0到23之间的任何整数。
# day:表示日期,可以是从1到31之间的任何整数。
# month:表示月份,可以是从1到12之间的任何整数。
# week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
# command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
# 在以上各个字段中,还可以使用以下特殊字符:
# 星号():代表所有可能的值,例如day字段如果是星号,则表示在满足其它字段的制约条件后每天都执行该命令操作。
# 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
# 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“3-6”表示“3,4,5,6”
# 正斜线(/):可以用正斜线指定时间的间隔频率,例如在hour字段中“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如/10,如果用在minute字段,表示每十分钟执行一次。
如何使用crondtab
*我在ftp上执行*
[root@ftp vsftpd]# rpm -qa | grep crontabs
crontabs-1.11-6.20121102git.el7.noarch
[root@ftp vsftpd]# systemctl start crond
[root@ftp vsftpd]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 四 2021-12-16 17:21:51 CST; 1h 56min ago
Main PID: 4835 (crond)
CGroup: /system.slice/crond.service
└─4835 /usr/sbin/crond -n
12月 16 17:21:51 ftp systemd[1]: Started Command Scheduler.
12月 16 17:21:51 ftp systemd[1]: Starting Command Scheduler...
12月 16 17:21:51 ftp crond[4835]: (CRON) INFO (RANDOM_DELAY will be scaled with....)
12月 16 17:21:51 ftp crond[4835]: (CRON) INFO (running with inotify support)
12月 16 17:21:51 ftp crond[4835]: (CRON) INFO (@reboot jobs will be run at comp....)
Hint: Some lines were ellipsized, use -l to show in full.
//进入编辑界面
//写入文件
[root@ftp vsftpd]#crontab -e
*/5 * * * * echo "11" >> /opt/test #每隔5分钟往test文件里面写入一行“11”
//查看列出crontab文件:
[root@ftp vsftpd]# crontab -l
*/5 * * * * echo "11" >> /opt/test
//删除
[root@ftp vsftpd]# crontab -r
//在列出就没有了
[root@ftp vsftpd]# crontab -l
no crontab for root
//删除提示
[root@ftp vsftpd]# crontab -ri
crontab: really delete root's crontab? y
书写crontab 定时任务时,需要注意以下几个事项:
(1) 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
(2)crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
(3) 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
(4)在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。
备份脚本
1.根据案例需求写一个使用shell脚本备份共享资源文件,这个脚本需要满足以下条件:
① 判断备份目录是否存在,不在则创建。
② 每次执行按照日期在备份目录中生成一个日期目录,并判断其是否存在,存在则删除上上周的目录;
③ 运用rsync将共享资源增量备份到日期目录中,并且输出结果。
rsync服务:
rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。
rsync的选项说明:
# -v:显示rsync过程中详细信息。可以使用”-vvvv”获取更详细信息。
#-P:显示文件传输的进度信息。(实际上”-P”=”—partial —progress”,其中的”—progress”才是显示进度信息的)。
# -n —dry-run :仅测试传输,而不实际传输。常和”-vvvv”配合使用来查看rsync是如何工作的。
# -a —archive :归档模式,表示递归传输并保持文件属性。等同于”-rtopgDl”。
# -r —recursive:递归到目录中去。
# -t —times:保持mtime属性。强烈建议任何时候都加上”-t”,否则目标文件mtime会设置为系统时间,导致下次更新检查出mtime不同从而导致增量传输无效。
# -o —owner:保持owner属性(属主)。
# -g —group:保持group属性(属组)。
# -p —perms:保持perms属性(权限,不包括特殊权限)。
# -D :是”—device —specials”选项的组合,即也拷贝设备文件和特殊文件。
# -l —links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
# -z :传输时进行压缩提高效率。
rsync的选项非常多,能够实现非常具有弹性的功能,以上选项仅仅只是很小一部分常用的选项,但最常用的选项组合是”avz”,即压缩和显示部分信息,并以归档模式传输。
*我在nfs节点上执行*
# rsync /etc/fstab /tmp # 在本地同步
# rsync -r 192.168.100.12:/etc /tmp # 将远程主机的/etc目录拷贝到本地/tmp下,以保证本地/tmp目录和远程/etc保持同步。
# rsync -a /etc /tmp #归档模式
//编写脚本
[root@ftp vsftpd]# vi /usr/local/sbin/backup.sh
a=`date '+%Y%m%d'`
b=/backup/weekbackup
c=/var/log/backup.log
pname=$(rpm -qa | grep rsync)
#判断rsync是否存在
if [ $? -eq 0 ]
then
echo "软件包rsync已经安装。"
else
echo "软件包rsync没有安装"
yum -y install rsync >> /dev/null
if [ $? -eq 0 ];then
echo "安装rsync完成。"
else
echo "安装rsync失败。"
fi
fi
#判断备份目录是否存在,并增量备份。
if [ ! -d "$b" ];then
mkdir -p $b
echo "$a Backup File missing!" >> /var/log/backup.log
rsync -rvz /data/* $b/$a
else
rsync -rvz /data/* $b/$a
if [ -d $b/$a ];then
echo "$a Backup success." >> /var/log/backup.log
find $b -mtime +14 | xargs rm -rf
else
echo "$a Backup failed." >> /var/log/backup.log
fi
fi
//给脚本权限不然会报错
[root@ftp vsftpd]# chmod 755 /usr/local/sbin/backup.sh
//添加定时任务:(每7天凌晨1点执行一次脚本)
[root@ftp vsftpd]# crontab -e
* 1 */7 * * sh /usr/local/sbin/backup.sh