原创系统笔记

Linux计划任务服务程序

本文阅读 6 分钟
首页 系统笔记 正文

计划任务分为一次性计划任务与长期性计划任务,可以按照如下方式理解。

  • 一次性计划任务:今晚23:30重启网站服务
  • 周期性计划任务:每周一凌晨3:25 把/home/wwwroot 目录打包备份为 backup.tar.gz。

一次性计划任务

一次性计划任务只执行一次,一般用于临时的工作需求。可以用 at 命令实现这种功能,只需要写成“at 时间”的形式就行。如果想要查看已设置好但还未执行的一次性计划任务,可以使用 at -l 命令;要想将其删除,可以使用“atrm 任务序号”。

at 命令中的参数及其作用如表所示。

参数作用
-f指定包含命令的任务文件
-q指定新任务的名称
-l显示待执行任务的列表
-d删除指定的待执行任务
-m任务执行后向用户发邮件

在使用 at 命令来设置一次性计划任务时,默认采用的是交互式方法。例如,使用下述命令将系统设置为在今晚 23:30 自动重启网站服务。

warning 提醒信息不要慌,at 命令只是在告诉我们接下来的任务将由 sh 解释器负责执行。这与此前学习的 Bash 解释器基本一致,不需要有额外的操作。

[root@servera ~]# at 23:00   //今天23:00
    warning: commands will be executed using /bin/sh
at> systemctl restart httpd    //重启网站服务
at> <EOT>                      //Ctrl + D 退出交互模式
    job 3 at Sat Sep 24 23:00:00 2022
[root@servera ~]# at -l      //at -l 查看设置的一次性计划任务
    3    Sat Sep 24 23:00:00 2022 a root

把前面学习的管道符(任意门)放到两条命令之间,让 at 命令接收前面 echo 命令的输出信息,以达到通过非交互式的方式创建计划一次性任务的目的。

[root@servera ~]# echo "systemctl restart httpd" | at 23:40
    warning: commands will be executed using /bin/sh
    job 4 at Sat Sep 24 23:40:00 2022
[root@servera ~]# at -l
    3    Sat Sep 24 23:00:00 2022 a root
    4    Sat Sep 24 23:40:00 2022 a root

上面设置了两条一样的计划任务,可以使用 atrm 命令轻松删除其中一条:

[root@servera ~]# atrm 4
[root@servera ~]# at -l
    3    Sat Sep 24 23:00:00 2022 a root

把计划任务写入 Shell 脚本中,当用户激活该脚本后再开始倒计时执行,而不是像上面那样在固定的时间(“at 23:30”命令)进行。这该怎么办呢?一般我们会使用“at now +2 MINUTE”的方式进行操作,这表示 2 分钟(MINUTE)后执行这个任务,也可以将其替代成小时(HOUR)、日(DAY)、月(MONTH)等词汇:

[root@servera ~]# at now +2 MINUTE  //两分钟后的一次性计划任务
    warning: commands will be executed using /bin/sh
at> systemctl restart httpd
at> <EOT>
    job 6 at Sat Sep 24 01:09:00 2022
[root@servera ~]# date
    Sat Sep 24 01:08:30 EDT 2022

周期性计划任务

希望 Linux 系统能够周期性地、有规律地执行某些具体的任务,那么Linux 系统中默认启用的 crond 服务简直再适合不过了。

创建、编辑计划任务的命令为 crontab -e,查看当前计划任务的命令为 crontab -l,删除某条计划任务的命令为 crontab -r。另外,如果您是以管理员的身份登录的系统,还可以在 crontab 命令中加上-u 参数来编辑他人的计划任务。crontab 命令中的参数及其作用如表所示。

参数作用
-e编辑任务计划
-u指定用户名称
-l列出任务列表
-r删除计划任务

口诀“分、时、日、月、星期 命令”。这是使用 crond 服务设置任务的参数格式(其格式见表 4-8)。需要注意的是,如果有些字段没有被设置,则需要使用星号( * )占位

img

假设在每周一、三、五的凌晨 3:25,都需要使用 tar 命令把某个网站的数据目录进行打包处理,使其作为一个备份文件。可以使用 crontab -e 命令来创建计划任务,为自己创建计划任务时无须使用-u 参数。crontab –e 命令的具体实现效果和 crontab -l 命令的结果如下所示:

[root@servera ~]# crontab -e
    no crontab for root - using an empty one
    crontab: installing new crontab
[root@servera ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

在 crond 服务中需要同时包含多条计划任务的命令语句,应每行仅写一条。例如我们再添加一条计划任务,它的功能是每周一至周五的凌晨 1 点自动清空/tmp 目录内的所有文件。

需要注意的是,在 crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用 whereis 命令进行查询。

[root@servera ~]# whereis rm
    rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
[root@servera ~]# crontab -e
    crontab: installing new crontab
[root@servera ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm /tmp/*

删除 crond 计划任务则非常简单,直接使用 crontab -e 命令进入编辑界面,删除里面的文本信息即可。也可以使用 crontab -r 命令直接进行清空

计划服务的注意事项。在 crond 服务的配置参数中,一般会像 Shell 脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。

原创文章,作者:張旭,如若转载,请注明出处:http://www.zxbke.cn/37.html/