vlambda博客
学习文章列表

RHCE7 第二十一篇 Linux计划任务

使用at计划一次性任务

at可以为系统用户用来计划将来的任务运行一次,这不是单机工具,而是一个系统守护进程atd,它有一组命令行工具可与守护进程at、atq等等进行交互。在RHEL安装过程中,atd守护进程将自动安装和启用,atd守护进行可以在at软件包中找到。

用户(包括root)可以使用命令行工具at为atd守护进程的作业排队,atd守护进程提供了a到z共26个队列,作业按字母顺序排列,队列越后,系统优先级越低。

 

使用命令at <TIMESPEC>可以计划新作业,at随后会读取从stdin执行的命令,对于较大的命令以及错别字敏感的命令,使用来自脚本文件(例如at now +5min<myscript)的输入重定向比在终端窗口中手动输入所有命令要简单,手动输入命令时,可以按ctrl+d来完成输入。


Linux下的at定时执行任务命令详解

一、at服务

systemctl start atd     //启动服务

systemctl stop atd     //关闭服务

systemctl restart atd  //重启服务

systemctl reload atd   //重新载入配置

systemctl status atd   //查看服务状态 


二、at配置文件:

at类似打印进程,会把任务放到/var/spool/at目录中,到指定时间运行它 。at命令相当于另一个shell,运行attime命令时,它发送一个个命令,可以输入任意命令或者程序。


三、参数详解

at [-V] [-q x] [-f file] [-mldbv] time
at -c jobnumber ----检查将要执行作业的实际命令=cat /var/spool/at/a…该输出会显示所设置的作业环境,以便在用户创建作业时反映用户的环境,后跟将要运行的命令。

atq [-V] [-q x]
atrm [-V] jobnumber-----删除计划的作业

-V :印出版本编号 

-q : 使用指定的队列(Queue)来储存,at的资料是存放在所谓的 queue 中,使用者可以同时使用多个 queue,而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共52 个 :at -q g 16:05 tomorrow

-m :即使程序/指令执行完成后没有输出结果, 也要发邮件给使用者,默认情况下都会发送邮件 

-f file :读入预先写好的命令档。使用者不一定要使用交互模式来输入,可以先将所有的指定先写入档案后再一次读入网络应用

-l : 列出所有的指定 (使用者也可以直接使用 atq 而不用at -l) 获得用户的待处理作业的概述

-d : 删除指定 (使用者也可以直接使用 atrm 而不用at -d) 

-v :列出所有已经完成但尚未删除的指定 

 

at命令执行流程

# at 2:05 tomorrow

at > /home/kyle/do_job

at > Ctrl+D


ATTime中的时间表示方法

-----------------------------------------------------------------------

时 间       例子         说明

-----------------------------------------------------------------------

Minute   at now + 5 minutes   任务在5分钟后运行

Hour      at now + 1 hour         任务在1小时后运行

Days      at now + 3 days          任务在3天后运行

Weeks   at now + 2 weeks     任务在两周后运行

Fixed     at midnight                 任务在午夜运行

Fixed     at 10:30pm                  任务在晚上10点30分

Fixed     at 23:59 9/18/2018     任务在2018年9月18号23点59分

 

[root@localhost ~]# at 5pm +3 days
at> /bin/date >/root/2.txt
at> <EOT>----ctrl+D
job 1 at 2018-08-30 17:00


[root@localhost ~]# atq
1    2018-08-30 17:00 aroot


[root@localhost ~]# at 2:05 tomorrow
at> echo the end of world !
at> <EOT>
job 2 at 2018-08-28 02:05


[root@localhost ~]# atq
2    2018-08-28 02:05 a root
1    2018-08-30 17:00 aroot


[root@localhost ~]# atrm 2


[root@localhost ~]# atq
1    2018-08-30 17:00 a root


atq(at -l)输出结果显示了以下信息:

作业编号,该作业计划的日期和时间,作业所在队列,作业所有者

普通非特权用户只能查看和控制自己的作业,root可以查看和管理所有作业。

 

/var/spool/mail/<作业所有者> 输出性命令,都会发送邮件

/var/spool/at  临时目录,用来存放计划任务

/etc/at.allow  该文件中的用户才可以使用at

/etc/at.deny  该文件中的用户禁止使用at

 

使用cron计划周期性作业

RHEL系统附带了特别针对周期性作业的crond守护进程,且默认开机启用并启动,crond是由多个配置文件和系统范围内的文件控制的,每个用户对应一个配置文件,这些配置文件使用户和管理员拥有细微的控制权,可以控制应执行周期性作业的确切时间,crond守护进程作为cronie软件包的一部分安装。如果从cron作业运行的命令未重定向的stdout或stderr生成任何输出,则crond守护进程将尝试使用系统中配置的邮件服务器将该输出通过电子邮件发送给拥有作业的用户。

普通用户可以使用crontab命令来管理作业:


-ri 在删除用户的crontab文件时给于确认提示,-r将从/var/spool/cron目录中删除某个用户的crontab文件



各个作业都包含6个字段,表示执行的时间和内容,如果前5个字段都与当前日期和时间相匹配,则会执行最后一个字段中的命令,字段按顺序为:分钟,小时,几号,月,星期几,命令


#每晚的21:30重启apache。

30 21 * * *  /usr/local/etc/rc.d/lighttpd restart

#每月1、10、22日4:45重启apache

45 4 1,10,22 * *  /usr/local/etc/rc.d/lighttpd restart

#每天早上6点10分

10 6 * * * date

#每两个小时   

0 */2 * * * date

#晚上11点到早上8点之间每两个小时,早上8点

0 23-7/2,8 * * * date

#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * mon-wed date

#1月份日早上4点

0 4 1 jan * date 

#表示每天23点59分执行脚本/home/oracle/scripts/alert_log_archive.sh

59 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1

#表示每5分钟执行一次脚本/home/oracle/scripts/monitoring_alert_log.sh

*/5 * * * * /home/oracle/scripts/monitoring_alert_log.sh>/dev/null 2>&1

#周一到周五每天下午 20:00 寄一封信给 [email protected]

0 20 * * 1-5 mail -s "**********" [email protected] < /tmp/maildata


用户可以使用 crontab工具来定制自己的计划任务,所有用户定义的crontab 文件都被保存在 /var/spool/cron/目录中。其文件名与用户名一致。作业执行完后,也会发送命令执行结果给作业所有者:/var/spool/mail/student,也可以在crontab -e中添加指定的邮箱:

/etc/cron.deny---该文件中所列用户不允许使用crontab命令

/etc/cron.allow---该文件中所列用户允许使用crontab命令

crond服务

安装crontab:

yum install crontabs -y

服务操作说明:

systemctl start crond //启动服务

systemctl stop crond //关闭服务

systemctl restart crond //重启服务

systemctl reload crond //重新载入配置

systemctl enable crond //开机自启动服务

 

计划系统cron作业

除了用户cron作业外,还有系统cron作业。系统cron作业不是使用crontab命令定义的,而是在一组配置文件中配置,这些配置文件之间的主要区别在于一个额外的字段,该字段位于星期几字段和命令字段之间,指定了作业应在哪个用户下运行。系统作业是在2个位置定义的:/etc/crontab和/etc/cron.d/*,还有预定义作业每小时,每天,每周和每月运行一次,这些作业将分别位于/etc/cron.hourly/  /etc/cron.daily/  /etc/cron.weekly/  /etc/cron.monthly/ 中的所有脚本,这些目录包含了可执行脚本,而不包含cron配置文件。(确保使置于这些目录中的所有脚本可执行chmod+x,如果某个脚本不可执行,则它不会运行。)

系统任务调度与用户任务调度不一样,需要直接在/etc/crontab里面配置,如果需要指定用户,还需要在执行命令前指定用户名。通过crontab-l 命令是查看不到系统任务调度任务的。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。


cat /etc/crontab

SHELL=/bin/bash-----指定了系统要使用哪个shell

PATH=/sbin:/bin:/usr/sbin:/usr/bin----指定了系统执行命令的路径

MAILTO=root----指定了crond的任务执行结果将通过电子邮件发送给root用户,为空,则表示不发送执行结果给用户

 

# For details seeman 4 crontabs

# Example of jobdefinition:

# .----------------minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  | .----------- day of month (1 - 31)

# |  | |  .---------- month (1 - 12) ORjan,feb,mar,apr ...

# |  | |  |  .-------- day of week (0 - 6) (Sunday=0 or 7) 

# |  | |  |  |

# *  * *  *  * user-name command to be executed

如果用的任务不是以hourly monthlyweekly方式执行,则可以将相应的crontab写入到crontab 或cron.d目录中。示例:

每隔二分钟执行一次脚本/opt/bin/test-cron.sh

可以在cron.d新建脚本echo-date.sh内容为

*/2 * * * *root  /opt/bin/test-cron.sh

 

示例:每天凌晨3点将server下的/boot 目录备份到desktop 的backup目录下

vim task.sh

#/bin/bash

time_day=`date+%Y%m%D`

tar cvf  /tmp/boot_${time-day}.tar/boot

scp /tmp/boot_${time-day}.tar [email protected]:/backup/ < /tmp/passwd_root.txt

 

crontab -u student -e

* 3 ** * /bin/sh /tmp/tar_boot.sh  >/dev/null 2>&1

 

/etc/cron.hourly/*的脚本是使用run-parts命令从/etc/cron.d/0hourly中定义的作业执行的,每日,每周和每月的作业也使用run-parts命令执行,但是从其他配置文件/etc/anacrontab执行。

 

[root@abin ~]# cat /etc/anacrontab

# /etc/anacrontab:configuration file for anacron

# See anacron(8) andanacrontab(5) for details.

SHELL=/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

# the maximal randomdelay added to the base delay of the jobs

RANDOM_DELAY=45

# the jobs will bestarted during the following hours only

START_HOURS_RANGE=3-22 作业不会在此范围外启动

 

#period in days   delay in minutes   job-identifier   command

1        5        cron.daily                nicerun-parts /etc/cron.daily

7        25        cron.weekly           nicerun-parts /etc/cron.weekly

@monthly45   cron.monthly       nicerun-parts /etc/cron.monthly

period in days  每多少天应运行一次该作业

delay in minutes  启动作业前 cron守护进程应等待的时间

job-identifier  /var/spool/anacron/ 中的文件名称,该文件将用于检查该作业是否已运行,在cron从/etc/anacrontab启动作业时,它会更新此文件的时间戳,同一时间戳可用于检查作业上次运行的时间。

[root@abin ~]# ll /var/spool/anacron/

-rw-------. 1 root root 9 Sep  8  21:32 cron.daily

-rw-------. 1 root root 9 Aug 31 20:10 cron.monthly

-rw-------. 1 root root 9 Sep  7  20:37 cron.weekly