zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Linux计划任务服务程序

2023-02-18 16:43:11 时间

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

  • 一次性计划任务:今晚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>                       # 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> 
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)。需要注意的是,如果有些字段没有被设置,则需要使用星号( * )占位

假设在每周一、三、五的凌晨 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 脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
  • 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。