Linux计划任务总结

一、计划任务简介

定时任务也叫例行性工作调度。
如果我们需要让linux系统按我们指定的时间规则自动的处理某些作业,例如在某个时间点执行某个脚本,周期性的备份数据,这时候就可以制定任务计划。
任务计划分为一次性和周期性两类。
注意:如果想要使用定时任务,首先要确保系统的时间格式,我们使用的是东八区时间,也就是北京时间。可以运行下边这条命令确认。

[root@localhost ~]# date
2021年 02月 01日 星期一 12:03:07 CST

如果时间不准备,运行下面这条命令进行调整。

[root@localhost ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

1.一次性任务
就是设定的任务做完以后就自动清除。
at:可以处理仅执行一次就结束调度的指令,不过要执行at时,必须要有atd这个服务的支持。在某些新版的distributions中,atd可能默认并没有启动,那么at这个指令就会失效!不过CentOS默认是启动的。
2.周期性
就是每隔一定的周期要执行的任务。
crontab:设置的工作将会循环的一直进行下去。可循环的时间为分钟、小时、日、周、月和年。
crontab除了可以使用指令执行外,亦可编辑/etc/crontab来达到目的。让crontab生效的服务是crond这个服务。

二、一次性计划任务

1.atd服务的启动
要使用单一工作调度时,Linux系统必须要有负责这个调度的服务,那就是atd服务。不过并非所有的Linux distributions都默认打开,所以要手动启用。

[root@localhost ~]# yum install -y at
[root@localhost ~]# systemctl restart atd
[root@localhost ~]# systemctl enable atd
[root@localhost ~]# systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 一 2021-02-01 12:10:34 CST; 11s ago
 Main PID: 123014 (atd)
   CGroup: /system.slice/atd.service
           └─123014 /usr/sbin/atd -f

2月 01 12:10:34 localhost.localdomain systemd[1]: Started Job spooling...
Hint: Some lines were ellipsized, use -l to show in full.

2.at的运行方式
一次性任务计划即执行完一次后就结束了,可以通过at或batch命令生成。计划内容会以文件的形式写入/var/spool/at目录中,一个任务计划对应一个文件,系统的服务进程atd会读取这些文件并执行。某任务执行完毕后,其对应的文件也会被自动删除。
为安全起见,我们通常需要编辑/etc/at.allow(白名单)或/etc/at.deny(黑名单)以允许或拒绝某些特定用户制定任务计划,这两个文件对at和batch命令都适用。

⑴直接在文件中输入用户名,一行一个用户;

⑵若这两个文件都不存在,默认只有root可以使用at和batch命令;

⑶/etc/at.allow若存在但没有任何内容,表示允许的用户为空,意即拒绝所有用户(root除外),同样/etc/at.deny若没有任何内容,则表示放行所有用户;

⑷为避免混乱,/etc/at.allow和/etc/at.deny通常不同时使用。但若两者都存在且有矛盾的地方,以/etc/at.allow优先;

3.使用方法
(1)at命令生成一次性任务计划
语法格式

at [option]... [TIME]

at命令后不能为空,必须接选项或参数。
常用选项

-d 作业编号:删除指定的待执行任务,相当于atrm;

-l:显示待执行的任务的列表,相当于atq;

-m:任务执行完成后向用户发送E-mail(默认);

-c 作业编号:显示指定作业的实际内容;

创建格式

at TIME
COMMAND1
COMMAND2
...
按Ctrl+D结束,结束符为EOT。

TIME格式

HH:MM 如14:30

HH:MM YYYY-MM-DD 如14:30 2015-10-07

HH:MM[am|pm] [Month] [Date] 如02:30pm October 07

HH:MM[am|pm] + number [minutes|hours|days|weeks]

例如

14:30 + 2 weeks
now + #UNIT 如now + 5minutes
noon,midnight,teatime,tomrrow

其它命令

atq:查看待执行任务列表,相当于at -l;

atrm:删除指定作业,相当于at -d;

注意:任务作业执行后,若有错误或标准输出,则会以邮件形式告知提交者。可重定向至其它地方或丢弃(> /dev/null)。

例1
如果我想在2020年6月20号晚上11点关机。ctrl + D保存并退出。

[root@localhost ~]# at 23:00 2020-06-20
at> /usr/sbin/shutdown -h now
at> <EOT>
job 1 at Sat Jun 20 23:00:00 2020

注意:在去写具体任务的时候,推荐命令使用绝对路径的方式。
查看工作

[root@localhost ~]# at -l
1 Sat Jun 20 23 :00:00 2020 a root

或者

[root@localhost ~]# atq
1 Sat Jun 20 23 :00:00 2020 a root

在/var/spool/at目录下产生一个文件。

[root@localhost ~]# cd /var/spool/at
[root@localhost at]# ls
a0000101950924  spool
[root@localhost at]# tail -5 a0000101950924
}
${SHELL:-/bin/sh} << 'marcinDELIMITER5fa21cd3'
/usr/sbin/shutdown -h now

marcinDELIMITER5fa21cd3

使用at -c + jobnumber查看具体信息

[root@localhost at]# at -c 1 | tail -5
}
${SHELL:-/bin/sh} << 'marcinDELIMITER5fa21cd3'
/usr/sbin/shutdown -h now

marcinDELIMITER5fa21cd3

删除工作

[root@localhost at]# at -d 1 或者 atrm 1
[root@localhost at]# at -l 或者 atq

例2
压缩日志并加上时间参数。

[root@localhost at]# date
2021年 02月 01日 星期一 12:37:05 CST
[root@localhost at]# date +%F
2021-02-01
[root@localhost at]# date "+%Y-%m-%d %H:%M:%S"
2021-02-01 12:37:44
[root@localhost at]# tar -zcP -f log_$(date +%F).tar.gz /var/log/messages
[root@localhost at]# ls
log_2021-02-01.tar.gz  spool

关于时间的引用,年月日和时分秒是分开引用的,不能同时使用,空格只是为了显示好看。

[root@localhost at]# vim /root/logbak.sh
#!/bin/bash
tar -zcP -f /tmp/log_$(date +%Y-%m-%d)' '$(date +%H:%M:%S).tar.gz /var/log/messages

写一个脚本,就是备份这一条命令。想要在7月1日晚上10点运行此脚本。

[root@localhost at]# at 22:00 2020-07-01 
at> /usr/bin/bash /root/logbak.sh 
at> <EOT> 
job 2 at Wed Jul 1 22:00:00 2020

(2)batch
batch不同于at的地方仅在于其所生成的任务计划是在系统空闲时执行的,故batch命令后不能指定时间。
其实batch是利用at来进行指令的下达,只是加入一些控制参数而已。batch神奇的地方在于它会在CPU的工作负载小于0.8的时候才进行你所下达的工作任务。
工作负载:CPU在单一时间点所负责的工作数量,不是CPU的使用率。
举例来说,如果我有一个程序需要一直使用CPU的运算功能,那么此时CPU的使用率可能到达100%,但是CPU的工作负载则是趋近于“1”,因为CPU仅负责一个工作。如果同时执行这样的程序两支呢?CPU的使用率还是100%,但是工作负载则变成2了。也就是说,当CPU的工作负载越大,代表CPU必须要在不同的工作之间进行频繁的工作切换。因为一直切换工作,会导致系统忙碌。系统如果很忙碌,还要额外进行at不太合理,所以才有batch指令的产生。
查看CPU负载

[root@localhost at]# uptime
12:54:53 up  2:42,  2 users,  load average: 0.28, 0.15, 0.14

uptime命令能够打印系统总共运行了多长时间和系统的平均负载。
uptime命令显示的信息依次为:当前时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。
系统平均负载:指在特定时间间隔内运行队列中的平均进程数。
如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
如果你的linux主机是1个双核CPU的话,当Load Average为6的时候说明机器已经被充分使用了。
模拟CPU高负载
将随机数字压缩最高级然后导入数据黑洞

[root@localhost at]# cat /dev/urandom | gzip -9 > /dev/null

如果想要更大的负荷,或者系统有多个核,那么只需要对数据进行压缩和解压就行。

[root@localhost at]# cat /dev/urandom | gzip -9 | gzip -d | gzip -9 | gzip -d > /dev/null

查看负载

[root@localhost at]# uptime
13:00:19 up  2:48,  2 users,  load average: 1.41, 0.45, 0.24

看到CPU负载慢慢增大,这时再运行batch,想中途结束就用Ctrl+C。

[root@localhost at]# batch
at> /usr/bin/echo hello batch > /tmp/test.txt
at> <EOT>
job 4 at Sat Jun 6 20:00:00 2020

使用watch命令可以一直显示某个命令运行的结果

[root@localhost at]# watch uptime
Every 2.0s: uptime 
Sat Jun 6 20:00:00 2020 20:17:13 up 4:12, 2 users, load average: 0.00, 0.06, 0.09

当CPU负载大于0.8的时候不会工作,然后我们停掉高负载,就会看到任务马上执行了。经过这次实验,大概为0.4左右才真正去执行。

三、周期性计划任务

周期性任务计划是由crond服务来控制的。与atd服务一样,crond也是默认启动的工作于后台的守护进程。
crond执行的每一项任务都会被记录到/var/log/cron这个日志文件中。
1.周期性任务计划分两类

(1)系统cron:定义在/etc/crontab文件中,直接编辑即可;

(2)用户cron:定义在/var/spool/cron目录中,每个用户都有一个与用户名同名的文件。
其功能类似于/etc/crontab,使用crontab命令生成;

系统通常自带cron服务程序和crontab命令,若没有,可使用如下命令安装:

yum -y install vixie-cron  #cron服务程序包
yum -y install crontabs  #crontab程序包

2.查看crond服务的状态

[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 一 2021-02-01 10:12:14 CST; 2h 56min ago
 Main PID: 732 (crond)
   CGroup: /system.slice/crond.service
           └─732 /usr/sbin/crond -n

2月 01 10:12:14 localhost.localdomain systemd[1]: Started Command Sche...
2月 01 10:12:14 localhost.localdomain crond[732]: (CRON) INFO (RANDOM_...
2月 01 10:12:14 localhost.localdomain crond[732]: (CRON) INFO (running...
Hint: Some lines were ellipsized, use -l to show in full.

3.使用者的设置
与at一样,也可以设置白名单(/etc/cron.allow)或黑名单(/etc/cron.deny)来限制使用crontab的用户,再次建议,这两个文件保留一个即可。
与at很像,以优先顺序来说,/etc/cron.allow比/etc/cron.deny要优先,而判断上面,这两个文件只选择一个来限制而已。因此建议只要保留一个即可,免得影响自己在设置上面的判断。一般来说,系统默认是保留/etc/cron.deny,你可以将不想让他执行crontab的那个使用者写入/etc/cron.deny当中,一个帐号一行。
4.使用方法
(1)用户周期性计划任务
使用crontab命令创建用户cron
语法格式

crontab -u username [-elr]

常用选项

-u:管理员可为其他用户创建任务l;

-e:打开编辑页面定义任务;

-l:列出已经定义的所有任务;
-r:移除所有任务;

crontab -e打开编辑页面后,一行一个任务进行编辑,每行包括6段,前5段为时间,最后一段为要执行的命令。
格式如下

分 时 日 月 周 命令

时间的表示

*:表示任何时刻都接受的意思,但所有时间段位上不能同时为*;

数字:表示具体某一小时某一分钟等,如8 8 8 8 *表示每年的8月8日8时8分;

,:表示分隔时段,表示一段时间范围,如8 9,13 * * *表示每天9:08和13:08;

*/: 在对应的时间位的有效取值上每多久一次,如*/8 * * * *表示每8分钟一次;

-:某个时间位上的连续区间,如10-50/8 * * * *表示第10分和第50分之间每8分钟一次;

举例
可以进入VI的交互页面

[root@localhost ~]# crontab -e
代表意义 分钟 小时 日期 月份 周 指令
指令数字范围 0-59 0-23 1-31 1-12 0-7 指令

注意:这些任务,不同的用户,可以是不同的任务,那么这个任务都在哪里呢?那个crontab每个人都只有一个文件存在,就是在/var/spool/cron里面。
建议:“指令下达时,最好使用绝对路径,这样比较容易找到可执行文件。”

[root@localhost ~]# cd /var/spool/cron/
[root@localhost cron]# ls 
root 
[root@localhost cron]# vim root 
[root@localhost cron]# cat root 
*/1 * * * * /usr/bin/bash /root/time.sh 

那么,该如何查询使用者目前的crontab内容呢?
查看任务内容

[root@localhost cron]# crontab -l 
*/1 * * * * /usr/bin/bash /root/time.sh 

删除任务

[root@localhost cron]# crontab -r 
[root@localhost cron]# crontab -l 
no crontab for root

注意:可以看到crontab里面整个内容都不见了。如果只是要删除某个crontab的工作项目,使用crontab -e来重新编辑即可。如果使用-r参数,是会将所有的crontab数据内容都删掉。
(2)系统周期性任务计划
系统的配置文件:/etc/crontab
这个“crontab -e”是针对使用者的cron来设计的,如果是“系统的例行性任务”,只要编辑/etc/crontab这个文件就可以了。

[root@localhost cron]# cat /etc/crontab
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这个crontab其实是/usr/bin/crontab这个可执行文件,但是/etc/crontab是一个纯文本文件。

[root@localhost cron]# ll /etc/crontab
-rw-r--r--. 1 root root 451 6月  10 2014 /etc/crontab

你可以以root的身份编辑一下这个文件。基本上,cron这个服务的最低侦测限制是“分钟”,所以“cron会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容”,因此,只要你编辑完/etc/crontab这个文件,并且将它储存之后,那么cron的设置就自动的会来执行了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值