Linux计划任务管理技术

GO

0. 计划任务服务程序

Linux系统的计划任务分为三种:

  1. 一次性计划任务(用at命令实现,由atd服务提供)
  2. 周期性计划任务(用crontab命令实现,由crond服务提供)
  3. 系统级别的计划任务及其扩展anacron:在一个指定时间间隔错过后自动执行任务

1. 一次性计划任务

1.1. at 命令

一次性计划任务只执行一次,一般用于满足临时的工作需求。我们可以用at命令来实现这种功能。用法如下:

  • at 时间 :添加一次性计划任务
  • at -l :查看已设置好但还未执行的一次性计划任务
  • atrm 任务序号 :删除一条一次性计划任务(还可以进入到/var/spool/at目录里把计划任务删除,计划任务的文件都保存在该目录里,可以用rm -f 文件名来删除(以文件的形式删除计划任务,因为计划任务是以文件形式保存在该目录中))

1.2. 关于at的说明

在通常情况下,超级用户都可以使用这个命令。对于其他用户来说,能否可以使用就取决于两个文件:/etc/at.allow/etc /at.deny

如果你要让哪个用户不能使用计划任务,就直接把他的用户名写进去就可以了,一排只能写一个。

同时写入allow 及deny, 允许。

1.3. at的使用示例

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

1
2
3
4
5
6
[root@theshuhost ~]# at 23:30
at> systemctl restart httpd
at> <EOT> # 此处请同时按下Ctrl + D组合键来结束编写计划任务
job 1 at Fri Jan 19 23:30:00 2018
[root@theshuhost ~]# at -l
1 Fri Jan 19 23:30:00 2018 a root

也可以利用管道符来达到非交互式的方式创建一次性计划任务的目的:

1
2
3
4
5
[root@theshuhost ~]# echo "systemctl restart httpd" | at 23:40
job 2 at Fri Jan 19 23:40:00 2018
[root@theshuhost ~]# at -l
1 Fri Jan 19 23:30:00 2018 a root
2 Fri Jan 19 23:40:00 2018 a root

如果我们不小心设置了两个一次性计划任务,可以使用下面的命令轻松删除其中一个:

1
2
3
4
5
6
[root@theshuhost ~]# at -l
1 Fri Jan 19 23:30:00 2018 a root
2 Fri Jan 19 23:40:00 2018 a root
[root@theshuhost ~]# atrm 2
[root@theshuhost ~]# at -l
1 Fri Jan 19 23:30:00 2018 a root


2. 周期性计划任务

相对与at,cron的优点就是能够周期性的执行某个命令,at却只能执行一次。

cron的后台进程名字是crond ,cron也是system V的服务,所以我们可以service crond start|stop 来启动和关闭此服务,也可以使用chkconfig或者ntsysv来选择cron服务的默认开启。

2.1. crontab 命令

Linux的周期性任务计划功能的操作都是通过这个crontab命令来完成的。常用的选项有:

  • -u:指定某个用户,不加-u选项则为当前用户
  • -e:制定计划任务
  • -l:列出计划任务(也可以到/var/spool/cron/目录查看。里面的文件名字就是对应用户的cron任务)
  • -r:删除当前用户的计划任务

在配置文件/etc/crontab中可以查看计划任务配置的规则:

1
2
3
4
5
6
7
8
9
10
11
12
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

以一个例子来说明其设置的格式:

  • crontab -e 回车后输入如下内容: 01 10 05 06 3 echo "ok" > /root/cron.log
  • 这样就增加了一条计划任务,关于计划任务内容的说明如下:
    • 每个字段的数字分别表示(从左到右):分、时、日、月、周、命令。
    • 上一个例子的含义是:在6月5日(这一天必须是星期三)的10点01分执行命令echo “ok” > /root/cron.log。
    • crontab -e命令实际上是打开了配置文件/var/spool/cron/username(如果是root用户,则打开的是/var/spool/cron/root),所使用的编辑器是vi,所以要保存的话则需要在命令模式下输入”:/wq”即可。
    • 注意:千万不要直接去编辑那个文件,因为可能会出错,所以一定要使用命令crontab -e来编辑。

使用该命令的其他常用用法:

  • crontab -l :查看已经设定的任务计划
  • crontab -r :删除任务计划

2.2. 一个问题的说明

vim /etc/crontabcrontab -e写入的定时运行有什么区别?

  • vim /etc/crontab:是系统级别定义的crontab,/etc/crontab的所有者和组都是root
  • crontab -e :是用户自定义的crontab,是所有的用户都可以写入的
  • 两种方法记录的位置不一样,一个在/etc/ 另一个在/var/ 里面。都被cron服务调用

2.3. 关于任务计划的练习

题目如下:

  1. 每天凌晨1点20分清除/var/log/slow.log这个文件
  2. 每周日3点执行”/bin/sh /usr/local/sbin/backup.sh”
  3. 每月14号4点10分执行”/bin/sh /usr/local/sbin/backup_month.sh”
  4. 每隔8小时执行”ntpdate time.windows.com”
  5. 每天的1点、12点、18点执行”/bin/sh /usr/local/sbin/test.sh”
  6. 每天的9点到18点执行”/bin/sh /usr/local/sbin/test2.sh”

答案如下:

  1. 20 1 * * * echo "" > /var/lpg/slow.log
  2. 0 3 * * 0 /bin/sh /usr/local/sbin/backup.sh
  3. 10 4 14 * * /bin/sh /usr/local/sbin/backup_month.sh
  4. 0 */8 * * * ntpdate time.windows.com
  5. 0 1,12,18 * * /bin/sh /usr/local/sbin/test.sh
  6. 0 9-18 * * * /bin/sh /usr/local/sbin/test2.sh

说明:

  1. 每隔8小时,就是用全部小时(0-23)去除以8,其实算出来应该是0、8、16三个数。
  2. 当遇到多个数(分钟、小时、月、周)例如第5题,则需要用都好隔开。
  3. 而时间段是可以用n-m的方式表示的,比如第6题中的9-18
  4. 在设置好所有的计划任务后需要查看一下crond服务是否启动:service crond status

3. 系统级别的计划任务及其扩展anacron

anacrontab就是系统计划任务的扩展文件:在一个指定时间间隔错过后自动执行任务。

这个是系统设置好了,清理系统垃圾或者是自动执行某些脚本的系统任务,一般我们做了解就行了,不要更改。

配置文件是/etc/anaconrtab

1
2
3
4
5
6
7
8
9
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#####格式是这样的:period(频率.天数) delay(延迟,分钟) job- identifier command
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly run-parts /etc/cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly

说明:

  • SHELL:就是运行计划任务的解释器,默认是bash
  • PATH:执行命令的环境变量
  • MAILTO:计划任务的出发者用户
  • HOME:家目录为/
  • run-parts是一个脚本,在/usr/bin/run-parts,作用是执行一个目录下的所有脚本/程序。
  • run-parts /etc/cron.hourly执行目录/etc/cron.hourly/之下的所有脚本/程序.
  • run-parts下面就是运行的命令
  • 第一行的意思是:每天开机65分钟后就检查cron.daily文件是否被执行了,如果今天没有被执行就执行它
  • 第二行的意思是:每隔7天开机后70分钟检查cron.weekly文件是否被执行了,如果一周内没有被执行就执行它
  • 和at差不多,就是/etc/cron.deny这个配置文件来控制, 同时写入allow 及deny, 允许.

OK

0%