1. crond计划任务概述

什么是计划任务,计划任务类似于我们平时生活中的闹钟。 在Linux系统的计划任务服务crond可以满足周期性执行任务的需求。 crond进程每分钟会处理一次计划任务, 计划任务主要是做一些周期性的任务目前最主要的用途是定时备份数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Schedule one-time tasks with at.   一次性调度执行 at
Schedule recurring jobs with cron. 循环调度执行 cron
Schedule recurring system jobs. 所有计划任务执行中的输出都会以邮件的方式发送给指定用户, 除非重定向


循环调度执行cron 进程每分钟会处理一次计划任务
[root@wenhs5479 ~]# systemctl status crond.service 
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2019-03-24 19:26:36 CST; 3min 22s ago
 Main PID: 9443 (crond)
   CGroup: /system.slice/crond.service
           └─9443 /usr/sbin/crond -n

3月 24 19:26:36 wenhs5479 systemd[1]: Started Command Scheduler.
3月 24 19:26:36 wenhs5479 crond[9443]: (CRON) INFO (RANDOM_DEL...
3月 24 19:26:37 wenhs5479 crond[9443]: (CRON) INFO (running wi...
Hint: Some lines were ellipsized, use -l to show in full.

[root@wenhs5479 ~]# ps aux |grep crond
root       9443  0.4  0.0 126284  1716 ?        Ss   19:26   0:01 /usr/sbin/crond -n
root      11960  0.0  0.0 112728   988 pts/0    S+   19:30   0:00 grep --color=auto crond
[root@wenhs5479 ~]#

计划任务分为以下两种情况:

  • 系统级别的定时任务:

清理系统缓存 临时文件清理 系统信息采集 日志文件切割

  • 用户级别的定时任务:

定时同步互联网时间 定时备份系统配置文件 定时备份数据库文件

2. crond配置文件详解

1
2
3
4
5
文件              说明
/etc/crontab        //crontab配置文件
/etc/cron.deny      //该文件中所列用户不允许使用crontab命令
/var/spool/cron/*   //所有用户定时文件都存放此目录,文件以用户名命名
/var/log/cron       //定时任务执行后的日志文件,可用来回溯

3. crond计划任务管理

crond任务管理

1
2
3
4
5
6
7
8
9
参数          含义                指定示例
[root@wenhs5479 ~]# crontab --help
-e      编辑crontab文件内容       crontab -e
-l      查看crontab文件内容       crontab -l
-r      删除crontab文件内容       crontab -r
-u      管理其他用户的计划任务 crontab -u wenhs5479 -l
注意: crontab {-l -e}实际上就是在操作/var/spool/cron/username

如何进行计划任务的备份?

crond时间含义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Example of job definition:
# .---------------- minute (0 - 59) //分钟
# |  .------------- hour (0 - 23)   //小时
# |  |  .---------- day of month (1 - 31)   //日期
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr //月份
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat  //星期
# |  |  |  |  |
# *  *  *  *  *   command to be executed

*    表示任意的(分、时、日、月、周)时间都执行
-    表示一个时间范围段, 如5-7点
,    表示分隔时段, 如6,0,4表示周六、日、四
*/n  表示每隔n单位时间, 如*/10 每10分钟

crond编写示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
00 02 * * * command      //每天2:00整 
00 02 1 * * command      //每月1号2:00整 
00 02 14 2 * command     //每年2月14号2:00整 
00 02 * * 7 command      //每周日2:00整 
00 02 * 6 5 command      //每年6月的周五2:00整
00 02 14 * 7 command     //每月14号2:00整或每周日2:00整,这两个时间都执行
00 02 14 2 7 command     //每年 2 月 14 号 2:00 整 或者 每周日 2:00 整,这两个时间都执行 
00 02 * * * command      //每天2:00整
*  02 * * * command      //每天2:00中的每一分钟 (错误示范)
* * * * *  command       //每分钟执行command
* * 14 2 *  command      //2月14号的每分钟(错误示范)
*/5 * * * *  command     //每隔5分钟 
00 02 * 1,5,8 * command  //每年1,5,8月的每天2:00整 
00 02 1-8 * *  command   //每月1到8号的2:00整 

crond书写规范

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
1.为计划任务增加必要的注释
[root@wenhs5479 ~]# crontab -l
##time sync
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null

2.规范计划任务执行脚本存放的路径/scripts/
[root@wenhs5479 ~]# crontab -l
##backup www to /backup
30 01 * * * /bin/sh /scripts/www_backup.sh &>/dev/null

3.执行shell脚本任务前加/bin/sh, 脚本结尾加&>/dev/null
调试好后应屏蔽debug输出信息,避免产生系统垃圾占用过多inode, 如需输出日志, 可重定向至日志文件
[root@wenhs5479 ~]# crontab -l
####backup www to /backup
30 01 * * * /bin/sh /scripts/www_backup.sh &>/tmp/www_backup.log

4. crond配置编写实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[root@wenhs5479 ~]# crontab -e

每天凌晨切割nginx日志
05 00 * * * /bin/bash -x /scripts/cut_nginx.sh &> /scripts/log/nginx.log

每天5点备份数据库
00 05 * * * /bin/bash -x /scripts/dump_sql.sh &>/scripts/log/mysql.log



注意:
1.我们所有的crond服务是运行的程序。而crontab命令用户用来设置定时规则的命令。
2.crond服务是企业生产工作中常用的重要服务,at很少使用,可以忽略。
3.几乎每个服务器都会用到crond服务。

5. crond计划任务调试

  1. 调整任务每分钟执行, 检测是否是否正常, 有些任务不要频繁执行
  2. 调整系统时间然后在检测任务, 生产不建议直接使用此方式 执行脚本, 将脚本执行输出写入指定日志文件, 观察日志内容是否正常
  3. 注意一些任务命令带来的问题echo “itw” >>/tmp/test.log &>/dev/null
  4. 命令使用绝对路径, 防止无法找到命令导致定时任务执行故障
  5. 查看/var/log/cron日志进行调试

建议: 将需要定期执行的任务写入脚本中, 建立/scripts目录统一存放脚本, 脚本中命令必须使用绝对路径,手动执行脚本检测输出是否正常, 然后将脚本加入计划任务测试, 测试后无问题将脚本输出写入对应的日志文件中即可。

计划任务添加步骤:

  • 手动执行保证执行命令的正确结果
  • 编写脚本
  • 执行脚本
  • 编写计划任务
  • 调试计划任务

6.at (一次性)

at 在指定的时间执行命令。

atq 列出用户的等待执行的作业;在用户是超级用户的情况下,列出所 有人的作业。

atrm 删除作业。

-V 在标准错误上输出版本号。

-m 当作业完成时即使没有输出也给用户发邮件。

-f file 从文件而不是标准输入中读取作业信息。

-l 是 atq 的别名。

-d 是 atrm 的别名。

-c 连接命令行中列出的作业并输出到标准输出。

实验:

在linux系统中备份脚本backup.sh需要再每周1-5的每天下午1点和晚上8点执行,下列哪个cron命令可以完成(D)

1
2
3
4
a. 00 13,20 * 1-5 * backup.sh
b. 0 13,20 1,5 * * backup.sh
c. * 13,20 * * 1-5 backup.sh
d. 00 13,20 * * 1-5 backup.sh

A:一月到五月的每天下午一点和晚上八点执行备份脚本 B:每个月的一号和五号的下午一点和晚上八点会执行备份脚本 C:每周一到周五的下午一点中的每一分钟和晚上八点的每一分钟执行一次备份脚本 D:符合题意要求

2.新建/scripts/httpd.sh文件,并让/scripts/httpd.sh脚本在每天的00:10分执行

1
10	00	* 	*	*	/bin/bash /scripts/httpd.sh

3.新建/backup目录,每周一下午5:50将/backup目录下的所有文件打包成 backup.tar.gz

1
50	17	*	*	1	/usr/bin/tar –czf backup.tar.gz /backup

4.写一个定时任务,每天0点5分把/var/log/nginx下7天前的文件转移到/backup/xxxx_xx_xx的目录中

1
5	0	*/7	*	*	/usr/bin/mv /var/log/nginx /backup$(date +"%Y-%m-%d")/

5.系统脚本/scripts/which.sh,如何定时每隔7分钟执行一次?

1
*/7	*	*	*	*  source /scripts/which.sh

6.如何不小心删除了/var/spool/cron/root文件,该如何恢复。

1
cat /var/log/cron | grep -i "whoami" > grep "CMD" | awk -F '(' '{print $3}' | awk -F ')' '{print $1}' | sort -u > cmd_tmp

backup_crontab.sh

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash

BACKUP_DIRECTORY="${HOME}/crontab_backup"

if [ ! -e "${BACKUP_DIRECTORY}" ]; then
        mkdir -p ${BACKUP_DIRECTORY}
fi

crontab -l > ${BACKUP_DIRECTORY}/$(date '+%Y%m%d').txt