Linux系统计划任务管理详解

在Linux操作系统中,除了用户即时执行的操作命令外,还可以配置在指定的时间,指定的日期执行预先计划的系统管理任务(如定期备份、定期采集检测数据)。CentOS系统默认已安装了at、cronie软件包,通过atd和crond这两个系统服务实现一次性、周期性计划任务的功能,分别通过at、crontab命令进行计划任务设置。

一、at一次性任务设置

使用at命令设置的计划任务只在指定的时间执行一次,前提是对应的系统服务atd必须已经运行。需要注意的事,计划任务的时间,日期必须安排在当前系统时间之后,否则无法正确的设置计划任务。

使用at设置一次性计划任务,需要检查两个配置:

  • 首先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
  • 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;
  • 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。

通过这个说明,我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为帐号没有在该文件中, 就能够执行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 指令的意思 。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可! 一个帐号写一行。

设置一次性任务的时候,在at命令行中依次指定执行任务的时间、日期作为参数(若只指定时间则表示当天的时间,若只指定日期则表示该日期的档期时间)确认后将进入“at>”提示符的任务编辑页面,每行设置一条执行命令,可以一次设置多条语句,最后按Ctrl+D组合键提交任务。

at指令操作的参数有:

Linux系统计划任务管理详解
[root@localhost ~]# date         //查询时间
Sun Sep  8 13:39:14 CST 2019
[root@localhost ~]# at 13:41 2019-9-8        //指定时间设置任务
at> pgrep -U root | wc -l > /tmp/ps.root        
//统计改时间点root用户运行的进程数量,保存到/tmp/ps.root文件中
at> <EOT>                                
//任务设置完毕后,按Ctrl+D组合键提交任务
job 3 at Sun Sep  8 13:41:00 2019
[root@localhost ~]# cat /tmp/ps.root 
132
//时间过后,查看执行效果
[root@localhost ~]# at 22:00 2019-9-8
at> shutdown -h now
at> <EOT>
job 4 at Sun Sep  8 22:00:00 2019
//在2019年9月8号晚上22:00关闭系统

对于已经设置但还未执行的计划任务,可以通过“atq”命令进行查询。但是已经执行过的at任务将不会显示在列表中,如下:

[root@localhost ~]# atq
4   Sun Sep  8 22:00:00 2019 a root

若要删除指定编号的at任务,可以使用“atrm”命令。删除后的at任务将不会被执行,并且不会显示在atq命令的显示结果中,但已经执行过的任务无法删除。

[root@localhost ~]# atq
4   Sun Sep  8 22:00:00 2019 a root
[root@localhost ~]# atrm 4                                   //删除第4条at计划任务
[root@localhost ~]# atq

仅执行一次的工作调度:
其实 batch 是利用 at 来进行指令的下达啦!只是加入一些控制参数而已。这个 batch 神奇的地方在于:他会在 CPU 的工 作负载小于 0.8 的时候,才进行你所下达的工作任务啦! 那什么是工作负载 0.8 呢?
这个工作负载的意思是: CPU 在单一时间点所 负责的工作数量。不是 CPU 的使用率。
可以使用“uptime”命令,查看cpu的负载情况!

Linux系统计划任务管理详解

二、crontab周期性的任务设置

使用crontab命令设置的计划任务可以按预设的周期重复执行,从而大大减轻设置重复性系统管理任务的操作。启用周期性任务也有一个前提条件,即对应的系统服务crond必须运行。

(1)crontab的配置文件和目录

crontab通过多个目录和文件设置计划任务,不同类型的任务由不同的配置文件来设置。

1)/etc/crontab——系统任务配置文件

/etc/crontab文件中设置的是维护Linux操作系统所需的任务,Linux操作系统及相关程序在安装时可自动设置,不建议用户手动修改此文件。文件内容如下:

[root@localhost ~]# cat /etc/crontab 
SHELL=/bin/bash                      //使用哪种shell接口
PATH=/sbin:/bin:/usr/sbin:/usr/bin              //可执行文件搜寻路径
MAILTO=root                               //若失败,将email发送给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

文件中包括设置shell环境、可执行路径等变量的操作,以及每小时、每天、每月需要制定的任务目录。

根据 /etc/crontab配置文件中的设定,crond将按照不同的周期重复执行相应目录中的任务脚本文件。

2)/var/spool/cron——用户cron任务的配置文件存放目录

由用户自行设置(使用crontab命令)的cron计划任务会被保存到目录/var/spool/cron中,文件名与用户名相同。

crond守护进程会自动检查/etc/crontab文件、/etc/cron.d目录及/var/spool/cron目录中的改动,如果发现有配置更改,他们就会被载入内存,所以当会被载入内存,所以当某个crontab文件改动后并不需要重新启动,crond守护进程就可以使设置生效。

用户定义的设置,位于文件"/var/spool/cron/用户名"。

(2)使用crontab命令管理用户的计划任务

设置用户的周期性计划任务列表主要通过crontab命令进行,结合不同的选项可以完成不同的计划任务管理操作。

常用的选项有:

  • -e:编辑计划任务列表;
  • -u:制定所管理的计划任务属于哪个用户,默认是针对当前用户,一般只有root用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。
  • -l:列表显示计划任务;
  • -r:删除计划任务列表。
1)编辑用户的计划任务列表

执行“crontab -e”命令后,将打开计划任务编辑界面(与vi中的操作相同)。通过该界面用户可以自行添加具体的任务配置,每行代表一个记录。配置格式,如图:

Linux系统计划任务管理详解

除了“*”号,还可以使用一些特殊的符号:

  • 减号“-”:可以表示一个连续的时间范围,如“1-4”表示整数1、2、3、4;
  • 逗号“,”:可以表示一个间隔的不连续的范围,如:3,4,6,8;
  • 斜杠符号“/”:可以用来制定间隔频率,如在日期字段中的“*/3”表示每隔3天;
[root@localhost ~]# crontab -e
50 7 * * * /usr/bin/systemctl start sshd
//每天7点50自动开启ssh服务
0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/*
//每隔5天清空一次FTP服务器的公共目录的数据

因各种计划任务在执行时不需要用户登录,所以计划任务配置记录中的命令建议使用绝对路径,以避免因缺少执行路径和无法执行命令的情况。

2)查看用户的计划任务列表

crontab命令结合“-l”选项可以查看当前用户的计划任务列表,对于root用户来说,还可以结合“-u”选项查看其它用户的计划任务。操作如下:

[root@localhost ~]# crontab -l                     //查看用户root自己的计划任务
50 7 * * * /usr/bin/systemctl start sshd
0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/*

[root@localhost ~]# crontab -l -u lisi           //查看用于lisi的计划任务
3)删除用户的计划任务列表

当只需要删除某一条计划任务是,可以通过“crontab -e”命令进行编辑;而若要清空某个用户的所有计划任务时,可以使用“crontab -r”命令。

[root@localhost ~]# crontab -r                //清空当前用户设置的计划任务
[root@localhost ~]# crontab -l
no crontab for root

在设置用户的crontab计划任务的过程中,由于每一条记录只能运行一条命令,难以完成更复杂的系统管理任务操作,因此在实际环境中,当需要按照固定周期运行一些操作复杂的任务时,通常是将相关命令编写成脚本,然后在计划任务配置中加载该脚本并执行。

4)可唤醒停机期间的工作任务——anacron

由于 anacron 默认会以一天、七天、一个月为期去侦测系统未进行的 crontab 任务,因此对于某些特殊的使用环境非常有 帮助。 举例来说,如果你的 Linux 主机是放在公司给同仁使用的,因为周末假日大家都不在所以也没有必要打开, 因此你的 Linux 是周末都会关机两天的。但是 crontab 大多在每天的凌晨以及周日的早上进行各项任务, 偏偏你又关机了,此时系统很多 crontab 的任务就无法进行。 anacron 刚好可以解决这个问题!
那么 anacron 又是怎么知道我们的系统啥时关机的呢?这就得要使用 anacron 读取的时间记录文件 (timestamps) 了! anacron 会去分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,两者比较后若发现有差异, 那就是在某些时刻没 有进行 crontab 啰!此时 anacron 就会开始执行未进行的 crontab 任务了!

anacron指令常用的参数:

Linux系统计划任务管理详解

注意:

  • 基本上,crontab 与 at 都是“定时”去执行,过了时间就过了!不会重新来一遍~
  • 那 anacron 则是“定期”去执行,某一段周期的执行 ~ 因此,两者可以并行,并不会互相冲突啦!

———————— 本文至此结束,感谢阅读 ————————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值