定时任务

1、at

1.1、语法格式:at 时间
1.2、atd服务的相关操作(开启start|关闭/停止stop|重启restart|启动状态查看status|开机自启动状态查看is-enabled|设置开机自启动enable|开机禁止自启动disable
[root@localhost ~]# systemctl stop atd        #关闭/停止atd服务
[root@localhost ~]# systemctl start atd       #开启atd服务
[root@localhost ~]# systemctl restart atd     #重启atd服务
[root@localhost ~]# systemctl status atd      #查看atd服务开启状态为running开启状态
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 二 2019-05-14 16:40:17 CST; 1h 32min ago
 Main PID: 586 (atd)
   CGroup: /system.slice/atd.service
           └─586 /usr/sbin/atd -f
5月 14 16:40:17 localhost.localdomain systemd[1]: Started Job spooling tools.
5月 14 16:40:17 localhost.localdomain systemd[1]: Starting Job spooling tools...
[root@localhost ~]# systemctl is-enabled atd    #查看atd服务开机自启动状态为`enabled`(开启状态)
enabled


[root@localhost ~]# systemctl disable atd       #设置atd服务开机自启动状态为`disabled`状态  
Removed symlink /etc/systemd/system/multi-user.target.wants/atd.service.
[root@localhost ~]# systemctl is-enabled atd    #查看atd服务开机自启动状态为`disabled`(关闭状态)
disabled


[root@localhost ~]# systemctl enable atd        #设置atd服务开机自启动状态为`enabled`状态  
Created symlink from /etc/systemd/system/multi-user.target.wants/atd.service to /usr/lib/systemd/system/atd.service.
[root@localhost ~]# systemctl is-enabled atd    #查看atd服务开机自启动状态为`enabled`(开启状态)
enabled
1.3、at计划任务的特殊语法
[root@localhost ~]# at 20:00 2019-05-14       #在某天的特定时间执行
[root@localhost ~]# at now +10min             #在10分钟后执行
[root@localhost ~]# at 17:00 tomorrow         #在明天下午5点执行
[root@localhost ~]# at 6:30pm +3days          #在3天后的下午6:30分执行 
[root@localhost ~]# at 23:00 < a.txt          #使用输入重定向的形式执行a.txt中预先写入的相关操作
1.4、查看at将要执行的计划任务列表

语法:at -l 或者 atq

[root@localhost ~]# atq
   6  	       Fri May 17 18:30:00 2019         a       root
#任务编号       将要执行的时间(计划执行的时间)      队列      执行者

注意:此处只能查看到还没有执行的任务。如果任务已经开始执行或者执行完毕了,是查看不到的。

1.5、查看具体的任务内容

(1)使用at -c 任务编号 查看具体的任务内容(具体的执行在输出信息的最后)

[root@localhost ~]# at -c 6
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
  ......此处省略......
${SHELL:-/bin/sh} << 'marcinDELIMITER6d9dc38f'
echo 123
marcinDELIMITER6d9dc38f

(2)使用cat /var/spool/at/任务文件名称查看具体任务内容

系统中所有的at计划任务都会存放在    /var/spool/at/    目录下
[root@localhost ~]# ll /var/spool/at/
总用量 4
-rwx------. 1 root   root   2786 5月  14 19:20 a00006018c3e16
drwx------. 2 daemon daemon    6 5月  14 19:27 spool
[root@localhost ~]# cat /var/spool/at/a00006018c3e16 
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
......此处省略......
${SHELL:-/bin/sh} << 'marcinDELIMITER0589938d'
echo 123
marcinDELIMITER0589938d

(3)使用tail -3 /var/spool/at/a00006018c3e16 查看具体任务内容

[root@localhost ~]# tail -3 /var/spool/at/a00006018c3e16 
${SHELL:-/bin/sh} << 'marcinDELIMITER0589938d'
echo 123
marcinDELIMITER0589938d
1.6、删除at计划任务

语法:atrm 任务编号

[root@localhost ~]# atq                #系统中有一个编号6的计划任务
6	Fri May 17 18:30:00 2019 a root  
[root@localhost ~]# atrm 6             #删除编号6计划任务
[root@localhost ~]# atq                #无任何输出信息,系统中已经没有at计划任务了
[root@localhost ~]# ll /var/spool/at   #该目录下已经没有记录任务的详细文件了
总用量 0
drwx------. 2 daemon daemon 6 5月  14 19:27 spool

2、crontab周期性定时任务

crond服务用来定期检查系统是否有要执行的工作,如果有要执行的工作便会自动执行该任务。

cron是Linux下的定时执行工具,可以在无需人工干预的情况下运行作业。

2.1、crond服务的相关操作

(1)关闭/停止crond服务

[root@localhost ~]# systemctl stop crond

(2)开启crond服务

[root@localhost ~]# systemctl start crond

(3) 重启crond服务

[root@localhost ~]# systemctl restart crond

(4) 查看crond服务开启状态,为running(开启状态)

[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (`running`) since 三 2019-05-15 09:40:48 CST; 4h 13min ago
 Main PID: 579 (crond)
   CGroup: /system.slice/crond.service
           └─579 /usr/sbin/crond -n
5月 15 09:40:48 localhost.localdomain systemd[1]: Started Command Scheduler.
5月 15 09:40:48 localhost.localdomain systemd[1]: Starting Command Scheduler...
5月 15 09:40:49 localhost.localdomain crond[579]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 46% if used.)
5月 15 09:40:50 localhost.localdomain crond[579]: (CRON) INFO (running with inotify support)

(5) 查看crond服务开机自启动状态,为enabled(开启状态)

[root@localhost ~]# systemctl is-enabled crond
enabled

(6) 设置crond服务开机自启动状态为disabled(禁止开机自启动)

[root@localhost ~]# systemctl disable crond
Removed symlink /etc/systemd/system/multi-user.target.wants/crond.service.
[root@localhost ~]# systemctl is-enabled crond
disabled

(7) 设置crond服务开机自启动状态为enabled状态 (允许开机自启动)

[root@localhost ~]# systemctl enable crond
Created symlink from /etc/systemd/system/multi-user.target.wants/crond.service to /usr/lib/systemd/system/crond.service.
[root@localhost ~]# systemctl is-enabled crond
enabled
2.2、crontab命令示例及参数说明
crontab -u test                 # -u 指定test用户的cron服务
crontab -l                      # -l 列出当前用户下的cron服务的详细信息
crontab -u test -l              # 列出指定用户test下的cron服务的详细信息
crontab -r                      # -r 删除cron服务
crontab -u test -r              # 删除指定用户test的cron服务
crontab -e                      # -e 编辑cron服务
crontab -u test -e              # 编辑指定用户test的cron服务
2.2、crontab -e 编辑时的语法规则
[root@localhost ~]#crontab -e
*          *         *         *         *         echo 123456
#分钟      小时       天        月        星期        要执行的任务
#0~59     0~23      1~31     1~12     1~7或0~6      脚本、命令等

(1) 具体格式说明如下:一行对应一个任务

字段

第一个字段

第二个字段

第三个字段

第四个字段

第五个字段

第六个字段

内容

*

*

*

*

*

command

含义

分钟

小时(几点)

天(几号)


星期

需要执行的任务

取值范围

0~59

0~23

1~31

1~12

1 ~7 或 0 ~6

命令/脚本

(2) 任务条目中,特殊符号的含义

符号

含义

示例

*

代表取值范围内的数字

任意/每

/

指定时间间隔频率

*/10(每十)0-23/2(每两个小时)

-

代表从某个数字到某个数字

8-17(8号到17号/8点到17点/8分到17分)

,

逗号代表分开几个离散的数字

6,10-13,25(6号,10号到13号,25号)

2.3、查看系统中所有用户的计划任务

系统中所有的周期性计划任务都保存在/var/spool/cron/目录下

[root@localhost ~]# ll /etc/spool/cron/         #查看系统中有哪些用户有计划任务
[root@localhost ~]# cat /etc/spool/cron/用户名   #使用cat查看具体的用户计划任务内容
2.4、系统级别的计划任务

系统级别的计划任务一般都为/etc/cron*

[root@localhost ~]# ll /etc/cron
cron.d/       cron.daily/   cron.deny     cron.hourly/  cron.monthly/ crontab       cron.weekly/

目录或文件

说明

cron.d/

是系统自动定期需要做的任务,但是又不是按小时、按天、按星期、按月来执行的,它们就放在这个目录下

cron.daily/

存放每天执行的脚本

cron.deny

控制用户是否能够做计划任务的文件

cron.hourly/

存放每小时执行的脚本

cron.monthly/

存放每月执行的脚本

crontab

主配置文件,也可在其中添加任务

cron.weekly/

存放每周执行的脚本

(1) /etc/crontab配置文件分析及其使用的相关注意

/etc/crontab配置文件

[root@localhost ~]# cat /etc/crontab 
SHELL=/bin/bash                     # 指定操作系统使用哪个shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin  # 系统执行命令的搜索路径
MAILTO=root                         # 把执行任务的结果信息通过邮件发送给指定用户

# For details see man 4 crontabs
# 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
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

使用crontab命令的注意事项

环境变量的问题(避免找不到命令或shell不同语法不通造成的不兼容从而导致执行出错)。
    清理邮件日志(比如使用重定向 > /dev/null 2>&1)。
    系统级别的调度任务和用户级别的调度任务虽然都可以放到系统级别去执行,但是不建议去这样做。

3、常见的计划任务写法举例(以重启Apache为例)

(1) 每天晚上21:00重启Apache

0  21  *  *  *  /etc/init.d/httpd  restart

(2) 每月1号、10号、22号的2:30重启Apache

30  2  1,10,22  *  *  /etc/init.d/httpd  restart

(3) 每月1号到10号的2:30重启Apache

30  2  1-10  *  *  /etc/init.d/httpd  restart

(4)每隔两天的上午8点到11点的第3和第15分钟执行重启Apache

3,15  8-11   */2   *  *   /etc/init.d/httpd  restart

(5) 晚上11点到第二天早上7点之间,每隔1小时重启Apache

*   23-7/1   *   *   *   /etc/init.d/httpd   restart

(6) 周一到周五每天晚上22:35寄一封信给root@test

35  22  *  *  1-5  mail -s nihao root@test < /etc/fstab

4、实战案例

1、实验需求:
1、每天1:00备份/etc/目录到/tmp/backup下面;
2、将备份命令写入一个脚本中;
3、每天备份的文件名格式要求:年-月-日_etc.tar.gz;
4、在执行计划任务时,不输出任何任务信息;
5、存放备份内容的目录要求只保留最近3天的备份数据。
2、需求分析(大致流程)
mkdir /tmp/backup
tar -zcf /tmp/backup/`date +%F`_etc.tar.gz /etc
find /tmp/backup -name *etc.tar.gz -mtime +3 -exec rm -rf {} \;
3、脚本编写
[root@localhost ~]# vim backup.sh
  #!/bin/bash
  find /tmp/backup -name *etc.tar.gz -mtime +3 -exec rm -rf {} \;
  tar -zcf /tmp/backup`date +%F`_etc.tar.gz /etc
4、编辑计划任务
[root@localhost ~]# crontab -e
  0  1  *  *  *  /root/backup.sh
  ~
  ~
  :wq
  [root@localhost ~]# crontab -l
  0 1 * * * /root/backup.sh

**注意:**工作中备份的文件不要存放到/tmp目录下,因为过一段时间系统会清理/tmp目录下的内容。