Linux定时执行任务——例行性工作调度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoucheng05_13/article/details/82918324

第1章 什么是例行性工作

举例来说,如果你想要在家人的生日前一天就发出一封email提醒自己不要忘记,那么发email这个工作就是例行性工作。例行性工作具有周期性和固定性,这些工作可以交由linux系统按时启动与完成。

第2章 linux工作调度种类

工作调度有两种方式:
1、 一种是例行性的,就是每隔一定的周期要来办的事项。
2、 一种是突发性的,这次做完就没有第二次了。
在linux系统中,这两种方式就分别对应着crontab与at这两个命令了。

第3章 仅执行一次的工作调度

at是个可以处理仅执行一次就结束调度的命令,不过要执行at,必须要有atd这个服务的支持才行。我们可以使用命令service atd status来查看atd服务是否启动:

[nigel@DevTJ-todo-1507091995 ~]$ service atd status
atd (pid  2047) is running...

如果没有启动,则可以使用service atd start来进行启动。

3.1 at的工作原理

at的工作原理非常简单:它使用at命令来生成所要运行的工作,并将这个工作以文本文件的方式写入var/spool/at/目录内,该工作便能等待atd这个服务的取用与执行了。

3.2 at的安全问题

由于at可以在后台定时执行命令,所以常常会被黑客用来执行病毒程序。因此对于at的使用权限就必须要相当谨慎。
我们可以利用/etc/at.allow与/etc/at.deny这两个文件来进行at的使用限制。从下面的at执行流程中,就可以看出这两个文件的作用:
1、 先寻找/etc/at.allow这个文件,写在这个文件中的用户才能使用at,没有在这个文件中的用户则不能使用(即使没在at.deny中)。
2、 如果/etc/at.allow不存在,就寻找/etc/at.deny文件,写在该中的用户则不能使用at,没有在该文件中的用户可以使用at。
3、 如果两个文件都不存在,那么只有root可以使用at命令。

通过上面的说明可以看出,at.allow的管理较为严格,而at.deny的管理则较为松散。在我的linux主机上,则仅保留了at.deny文件。

3.3 at语法

at的语法如下所示:

at [-mldv] TIME
at -c 工作号码

参数:

-m:当at工作完成后,即使没有输出信息,也发email通知用户该工作已完成
-l:list,相当于atq,列出该用户的所有at调度
-d:delete,相当于atrm,取消一个工作调度
-v:显式工作将被执行的时间
-c:列出该调度的工作内容——要执行的命令等

TIME:时间格式,定义什么时候执行at的工作内容

    HH:MM   如04:30
        在今天的HH:MM执行,若已超过该时刻,则明天这个时刻执行。
    HH:MM YYYY-MM-DD   如04:30 2018-10-01
        在指定年月日、时分秒时刻执行at调度
    HH:MM + number [minutes|hours|days|weeks]
        在某个时间点后再加多长时间运行。如now + 5 minutes

3.4 at使用示例

使用at定义一项任务:2分钟后向远程终端pts/1打印“Hello World”:

扫描二维码关注公众号,回复: 3428817 查看本文章
root@VM-32-73-ubuntu:/dev# at now + 2 minutes
at> echo "Hello World" >/dev/pts/1
at> <EOT>
job 3 at Mon Oct  1 14:47:00 2018
root@VM-32-73-ubuntu:/dev# atq
3       Mon Oct  1 14:47:00 2018 a root
//2 minutes later
root@VM-32-73-ubuntu:/dev# Hello World

可以看到,2分钟后向屏幕打印了HelloWorld字符串。
从上面可以看出,当我们使用at时,会进入一个at shell的环境来让用户执行工作命令,当命令输入完成后使用EOF(ctrl+d)来退出该环境。在at中设置工作时,最好使用绝对路径,这样可以避免一些不必要的错误。

第4章 周期性执行的工作调度

crontab这个命令所设置的工作将会循环一直进行下去。可循环的时间为分钟、小时、每周、每月或每年等。crontab除了可以使用命令执行外,也可以编辑/etc/crontab来支持。至于让crontab可以生效的服务则是crond这个daemon。
我们同样可以使用service crond status这个命令来查看cond服务是否开启:

[nigel@DevTJ-todo-1507091995 ~]$ service crond status
crond (pid  2025) is running...

4.1 crontab的工作原理

与at类似,使用crontab命令新建工作调度之后,该项工作就会被记录到/var/spool/cron/里面,并且是以账号来区分,如下所示:

[root@ /var/mail]# ls /var/spool/cron/
user1  root  nigel

不要使用vim去编辑这些文件,因为可能会由于输入语法错误导致无法执行cron。
另外,cron执行的每一项工作都会被记录到/var/log/cron这个日志文件中,所以我们可以时常查看一下该文件来判断系统是否别木马入侵。

4.2 crontab的安全问题

同at一样,crontab也是通过/etc/cron.allow和/etc/cron.deny这两个文件来限制用户对该命令的使用。读取顺序和优先级同at一样。

4.3 crontab语法

crontab的语法如下所示:

crontab [-u username] [-l|-e|-r]

参数:

-u:只能由root使用,将该项调度分配给username。若不带该参数,则默认为当前用户的任务调度
-l:列出当前用户的crontab工作内容
-e:编辑crontab的工作内容。使用该命令后会自动进入vi界面。
-r:删除当前用户的所有crontab工作内容。单项工作的删除通过-e来完成。

4.4 crontab使用示例

使用crontab -e编辑工作文件,新增如下内容:

41 * * * * echo "Hello World">/dev/pts/12

:wq保存退出后,等到下一个41分的时候,屏幕上输出了“Hello World”:

[nigel@DevTJ-todo-1507091995 ~]$ crontab -e
crontab: installing new crontab
[nigel@DevTJ-todo-1507091995 ~]$ Hello World

4.5 crontab内容解读

在上例中新增的一行就是一项工作,所有的工作都有固定格式,它们由6个字段组成,这6个字段意义如下:

代表意义 分钟 小时 日期 月份 命令
数字范围 0~59 0~23 1~31 1~12 0~7 工作内容

辅助字段说明:

特殊字符 代表意义
* 代表任何时刻都接受
,(逗号) 表示分隔时段。如要执行的工作是3:00和6:00时,就会是:0 3,6 * * * command
-(减号) 代表一段时间范围内,举例来说,8~12点的每小时20分都执行:20 8-12 * * * command
/n(斜线) n代表数字,即每隔n单位间隔。例如每5分钟执行一次:*/5 * * * * command

第5章 系统配置文件/etc/crontab

crontab -e 是针对用户来设计的(/usr/bin/crontab可执行文件),如果是系统的例行性调度,则可以通过修改/etc/crontab(纯文本文件)来实现。
cron这个服务会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容,然后一一判断,达到了条件的就执行。因此我们添加任务时最小时间单位是分,而且直接修改完文件,然后保存就能生效。(有的distribution是将文件读入到内存,在这种情况下想要立即生效则需要重启crond这个服务)
/etc/crontab的内容如下所示:

SHELL=/bin/bash
  2 PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3 MAILTO=root
  4 HOME=/
  5
  6 # For details see man 4 crontabs
  7
  8 # Example of job definition:
  9 # .---------------- minute (0 - 59)
 10 # |  .------------- hour (0 - 23)
 11 # |  |  .---------- day of month (1 - 31)
 12 # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
 13 # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
 14 # |  |  |  |  |
 15 # *  *  *  *  * user-name command to be executed

字段描述注释已经说得很清楚了。需要注意的是,这种方式中多了一个user-name字段,用于指定该工作所属的用户。

本文章总结自《鸟哥的linux私房菜 第三版》

猜你喜欢

转载自blog.csdn.net/zhoucheng05_13/article/details/82918324