计划任务服务程序

1 一次定时任务

  • 守护进程atdat命令提供服务
1
2
3
4
5
6
7
# 查看服务是否在运行
service atd status
# 重启atd服务
service atd restart
# at用户的黑白名单设置(默认只有黑名单,禁用指定用户)
vim /etc/at.deny
vim /etc/at.allow
  • at时间格式
1
2
3
4
5
HH:MM                                 如: at 02:30
HH:MM YYYY-MM-DD 如:at 8:00 2020-01-01
HH:MM[am | pm] [month] [date] 如:at 8:00 Oct 1 # 在十月一号的八点
HHlMM[am | pm] + number [minutes | hours | days | weeks] 如:at 8:00 + 1 days
# 最常用的的一个时间:now + 时间 比如在十分钟后:at now + 10 minutes,在一天后:at now + 1 days
  • at命令使用实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 交互式
at now + 2 minutes
at> ./test.sh
at> systemctl restart httpd
at> EOF # 按ctrl + D 结束输入,并提示job编号
job 1 at 2022-05-08 19:15

# 将指令通过管道符传入至atd服务
echo "systemctl restart httpd" | at now + 5 minutes # 注意要通过echo传入

# 常用参数
at [-ldc]
-l:列出当前用户的at任务列表,也可使用 atq
-d 任务编号:取消一个at 任务,后面跟 at 任务编号,也可使用atrm 任务编号代替
-c 任务编号:显示该任务的实际内存,如:at -c 1 ,显示 1 号任务的详情

2 周期性定时任务

Linux中默认启用crond服务来周期性、有规律的执行某些特定任务

  • 安装

    1
    yum install cronie
  • 任务参数格式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 【 分钟 小时 日 月 星期 】 命令 或 脚本
    0 2 * * * /bin/sh test.sh # 每天晚上2:00自动执行

    crontab -e # 创建、编辑
    crontab -l # 列举、查看
    crontab -r # 清空所有

    # 查看其他用户的Crontab命令集合
    crontab -u username -l
  • 时间符号

    • 逗号(,)表示多个离散的时间点 如:1,2,4 表示周一、周二、周四
    • 短横线(-)表示连续的一段时间 如:12-15 表示一个月的12至15号
    • 除号(/)表示任务间隔时间 如:*/10 表示每10分钟执行一次
  • 特殊说明

    • 所有的命令一定要用绝对路径 可以通过whereis来获取
    • 包含多个计划任务时,每行只能写一条,规定一个任务
    • 分钟 时间字段不能省略,最小时间间隔是1min

2.1 开机自启

1
2
3
4
5
6
7
8
9
10
# 编辑开机加载项
vim /etc/rc.d/rc.local

# 添加开机自动执行的脚本
/bin/bash /home/scripts/test.sh
# 开机自启crond服务
systemctl start crond.service

# 添加权限
chmod +x /etc/rc.d/rc.local

2.2 配置corntab定时器

可以通过crontab -e便捷编辑,也可以写入crontab文件

系统默认的crontab定时任务定义文件为: vim /etc/crontab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SHELL=/bin/bash
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

# 在这里添加定时任务
30 20 * * * /etc/test.sh # 每天8:30执行

编辑好后重载生效

1
2
crontab /etc/crontab              # 重载crontab文件
systemctl reload crond.service # 重启crond服务

另:启动、停止、重启服务

1
2
3
systemctl start crond.service
systemctl stop crond.service
systemctl restart crond.service

2.3 实用例子

  1. 每日任务

    1
    30 8 * * * /usr/bin/tar -zcvf backup.tar.gz /home/log  # 每天8:30
  2. 每周六,周日

    1
    0 18 * * sat,sun /scripts/warn.sh  # 每周六、周日 18:00
  3. 每10分钟执行一次

    1
    */10 * * * * /scripts/monitor.sh
  4. 每分钟执行一次

    1
    * * * * * /scripts/monitor.sh
  5. 每3s执行一次

    1
    * * * * * sleep 3s; /scripts/monitor.sh
  6. 每年执行一次

    1
    @yearly /scripts/hello.sh
  7. 系统重启时执行

    1
    @yearly /scripts/info.sh
  8. 每个月第一个周六

    1
    0 17 * * sat  [ $(date +%d) -le 07 ] && /script/script.sh
  9. 配置多个周期任务

    1
    2
    0 */1 * * * /scripts/script1.sh; /scripts/scrit2.sh   # 每4个小时执行一次这2个脚本
    30 9 * * 1,3,5 /scripts/test.sh # 周一、周三、周五早上9:30执行
  10. 配置多个周期任务

    1
    2
    0 */1 * * * /scripts/script1.sh; /scripts/scrit2.sh   # 每4个小时执行一次这2个脚本
    30 9 * * 1,3,5 /scripts/test.sh # 周一、周三、周五早上9:30执行
  11. 将cron结果重定向给特定的用户

    1
    2
    3
    # crontab -l
    MAIL=Tom
    0 2 * * * /script/backup.sh
  12. cron指令备份与恢复

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # crontab -l > cron-backup.txt
    # cat cron-backup.txt
    MAIL=Tom
    0 2 * * * /script/backup.sh

    # crontab cron-backup.txt
    # crontab -l
    MAIL=Tom
    0 2 * * * /script/backup.sh